编译应用程序时,我一直遇到此链接错误:
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()获取链接失败,这似乎是known issue。我通过添加以下代码为此做了一个解决方法。我想它不会给我带来太多问题,因为我的数据类型在作业完成之前不会被清除。
void MPI::Datatype::Free(void) {
}
答案 0 :(得分:2)
要反映@cschwan所说的内容,MPICH实际上也不再支持Windows了。支持已在1.4.1p版本中停止。不幸的是,大型开源实现都没有时间用于很多Windows支持,因为它不再被教室外的太多人使用,也没有开发人员使用Windows。但是,Windows中MPI的最佳解决方案是直接转向Microsoft。在你开始发布基于MS-MPI的任何工作之前,我会仔细检查他们的许可证是否同意你正在计划的任何用途。我对他们的工作原理并不太熟悉。
http://www.microsoft.com/en-us/download/details.aspx?id=36045
这是维基页面,它解释了MPICH现在对事物的立场:
就C ++绑定而言,由于它们已从MPI中删除,因此您不会再从大型开源实现中获得太多支持。但是,还有其他绑定可用。我知道Boost有一些可用的(http://www.boost.org/doc/libs/1_54_0/doc/html/mpi.html),虽然我没有经验可以使用它们。现在有一个关于scicomp网站正在进行的有趣讨论。如果你有意见和经验,你可能会权衡:
https://scicomp.stackexchange.com/questions/7978/what-features-do-users-need-from-an-mpi-c-interface
答案 1 :(得分:1)
我不知道你的问题的原因,但我认为你遇到了无法维护的代码: