1

编译我的应用程序时,我不断遇到此链接错误:

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) {
}
4

2 回答 2

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 现在对事物的立场的 wiki 页面:

http://wiki.mpich.org/mpich/index.php/Frequently_Asked_Questions#Q:_Why_can.27t_I_build_MPICH_on_Windows_anymore.3F

就 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

于 2013-07-15T14:55:02.037 回答
1

我不知道您的问题的原因,但我认为您遇到了未维护的代码:

  • OpenMPI 已停止支持 Windows,请参见此处:http ://www.open-mpi.org/software/ompi/v1.6/ 。您可以改用 MPICH,可从http://www.mpich.org/downloads/获得。MS Windows 的链接会将您重定向到 Microsoft 的 MS-MPI。
  • 我还建议避免使用 C++ 绑定,因为它们也已被弃用。只需使用 C 绑定即可。
于 2013-07-15T14:29:45.530 回答