编译我的应用程序时,我不断遇到此链接错误:
error LNK2001: unresolved external symbol "public: __cdecl MPI::Comm::Comm(void)" (??0Comm@MPI@@QEAA@XZ) E:\Users\UT1JVT\Tanoshii\Eden\Inceptor2\Inceptor2\Node.obj Inceptor2
如果我连续编译两次,它会变成这个(可能是增量链接?):
error LNK2019: unresolved external symbol "public: __cdecl MPI::Comm::Comm(void)" (??0Comm@MPI@@QEAA@XZ) referenced in function "public: __cdecl MPI::Intracomm::Intracomm(struct ompi_communicator_t *)" (??0Intracomm@MPI@@QEAA@PEAUompi_communicator_t@@@Z) E:\Users\UT1JVT\Tanoshii\Eden\Inceptor2\Inceptor2\Node.obj Inceptor2
我已经在 x64 和 32 位模式下使用匹配的 MPI 库进行了尝试,但无济于事。我还定义了:(OMPI_IMPORTS, OPAL_IMPORTS and ORTE_IMPORTS
它修复了我以前的一些链接错误)但我仍然无法摆脱这个。
违规行是:
_roleLocalComm = &MPI::COMM_WORLD.Split(_roleId,_nodeId);
如果我删除这一行(所有创建通讯组的代码),错误就会消失。我在 Linux (Open MPI v1.6.5) 中构建了相同的源代码,它运行良好。
这是编译命令:
/Zi /nologo /W3 /WX- /Od /D "_DEBUG" /D "_CONSOLE" /D "OMPI_IMPORTS" /D "OPAL_IMPORTS" /D "ORTE_IMPORTS" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"x64\Debug\testx64.pch" /Fa"x64\Debug\" /Fo"x64\Debug\" /Fd"x64\Debug\vc100.pdb" /Gd /errorReport:queue
更新: 我尝试将其剥离为裸露的骨骼并使用 mpic++ 对其进行编译,但我仍然遇到同样的问题。这是命令行:
mpic++ EntryPoint.cpp -showme
cl.exe EntryPoint.cpp /D "OMPI_IMPORTS" /I"C:\Program Files\OpenMPI_v1.6.2-x64\include" /TP /EHsc /link /LIBPATH:"C:\Program Files\OpenMPI_v1.6.2-x64\lib" libmpi_cxx.lib libmpi.lib libopen-pal.lib libopen-rte.lib advapi32.lib Ws2_32.lib shlwapi.lib
一开始无法让它工作(大量的链接错误),但后来我意识到它OMPI_IMPORTS
没有定义,所以我编辑了 %openmpi%/share/openmpi/mpic++-wrapper-data.txt 来添加/D "OMPI_IMPORTS"
此外,它可能都提到我也遇到了 MPI::Datatype::Free() 的链接失败,这似乎是一个已知问题。我通过添加以下代码对此进行了解决。我想这不会给我带来太大的问题,因为在工作完成之前我的数据类型不会被清理。
void MPI::Datatype::Free(void) {
}