我正在尝试为 Windows 构建一个简单的 Open MPI 应用程序。我已经安装了 OpenMPI-v1.6.2(64 位)的二进制文件。我还安装了 Visual Studio 2010。机器是 Windows 7 x64。
当我尝试编译一个使用 MPI::Send() 的简单程序时,我收到一个链接器错误,指出它无法解析 MPI::Datatype::Free()。
这是一个最小的例子:
#include <mpi.h>
#include <iostream>
int main( int argc, char** argv ) {
MPI::Init(argc,argv);
// Meant to run with 2 processes.
if (MPI::COMM_WORLD.Get_rank() == 0) {
int data;
MPI::COMM_WORLD.Recv(&data,1,MPI_INT,1,0);
std::cout << "received " << data << std::endl;
} else {
int data = 0xdead;
std::cout << "sending " << data << std::endl;
MPI::COMM_WORLD.Send(&data,1,MPI_INT,0,0);
}
MPI::Finalize();
}
当我编译它时:
mpic++ send_compile.cpp -o send_compile.exe -DOMPI_IMPORTS -DOPAL_IMPORTS -DORTE_IMPORTS
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
cl : Command line warning D9035 : option 'o' has been deprecated and will be removed in a future release
send_compile.cpp
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:send_compile.exe
/out:send_compile.exe
"/LIBPATH:C:\Program Files (x86)\OpenMPI_v1.6.2-x64/lib"
libmpi_cxx.lib
libmpi.lib
libopen-pal.lib
libopen-rte.lib
advapi32.lib
Ws2_32.lib
shlwapi.lib
send_compile.obj
send_compile.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl MPI::Datatype::Free(void)" (?Free@Datatype@MPI@@UEAAXXZ)
send_compile.exe : fatal error LNK1120: 1 unresolved externals
该程序可以在附近的 Ubuntu 机器上编译和运行,没有任何问题。我不知道问题是什么。Open MPI 的文档没有说明任何关于添加 CPP 定义(OMPI_IMPORTS、OPAL_IMPORTS、ORTE_IMPORTS)的内容,这些定义的缺失导致了与此类似的其他链接器错误。不过,我找不到有关此特定问题的任何信息。
我尝试使用 dumpbin 来获取 MPI 安装的 .lib 文件中的符号,但没有找到对该函数名称的任何引用。我也没有在 MPI 标头中找到任何答案。
我在 C 语言中有一个类似的程序,可以在这台 Windows 机器上编译和运行良好。我不知道我在 C++ 上做错了什么。有人可以指出我正确的方向吗?