MPICH2安装在C:\ Program Files \ MPICH2中。有两个子目录(感兴趣),\include
包含.h文件,\lib
包含.lib文件。
MPICH2附带的自述文件有以下说明:
–I...mpich2\include
–L...mpich2\lib
–lmpi
由于我的项目中没有其他规则,我不创建makefile,我只是转到命令行并尝试编译如下:
g++ -I"C:\Program Files\MPICH2\include" main.cpp -L"C:\Program Files\MPICH2\lib" -lmpi
这给了我代码中每个MPI符号的undefined reference
个错误。我花了好几个小时试图修复它,杂乱-I
,-L
和-l
切换,拖拽参数的顺序,甚至将所有.lib文件复制到与我的源相同的目录中,但似乎没有任何效果。
需要什么样的伏都教来连接这个东西?
编辑:我想我发现了问题:这里是详细模式下链接器输出的摘录(将-Wl,--verbose
添加到编译命令中):
attempt to open C:\Program Files\MPICH2\lib/libmingwex.dll.a failed
attempt to open C:\Program Files\MPICH2\lib/mingwex.dll.a failed
attempt to open C:\Program Files\MPICH2\lib/libmingwex.a failed
attempt to open C:\Program Files\MPICH2\lib/mingwex.lib failed
attempt to open C:\Program Files\MPICH2\lib/libmingwex.dll failed
attempt to open C:\Program Files\MPICH2\lib/mingwex.dll failed
attempt to open C:\Program Files\MPICH2\lib\libmingwex.a failed
显然,链接器会将/
而不是\
添加到我提供的目录名中(除非出于某种原因查找lib___.a
格式),这显然很明显不是一条有效的道路。有没有办法告诉链接器使用反斜杠而不是斜杠?
这也引起了我的注意:
attempt to open /mingw/lib/libmingwex.a succeeded
所以我尝试这样编译:
g++ -I"/Program Files/MPICH2/include" -L"/Program Files/MPICH2/lib" objManager.cpp ongom.cpp io.cpp main.cpp -lmpi -lcxx
但我仍然遇到同样的undefined reference
错误。
答案 0 :(得分:3)
GCC 能够查找您的图书馆。否则会报告:cannot find -lmpi
。
不知何故,该库中的无法找到例程。我设法用这种语法编译一个例子:
g++ -I../include cpilog.c ../lib/mpi.lib ../lib/mpe.lib
我在msys里面做过那个。我的目录不包含空格。
删除libmpi.a
文件后,这也有效:
g++ -I../include -L../lib cpilog.c -lmpi -lmpe
答案 1 :(得分:1)
尝试添加-lmpicxx
(用于c ++绑定的lib),并确保{/ 1}}在 cpp源文件*后来到。这对我有用:
-l...
编辑:re:“对'MPI_Comm_rank'的未定义引用”:你可能正在混淆/使用c和/而不是c ++吗? g++ -Iinclude -Llib test/cxxpi.cpp -lmpicxx -lmpi
seems to be c绑定 - c ++绑定为MPI_Comm_rank
。也许尝试将程序编译为c,或者,如果你想使用c ++,使用正确的绑定(参见示例目录中的MPI::Comm::Get_rank()
)?
* http://newsgroups.derkeiler.com/Archive/Comp/comp.parallel.mpi/2006-08/msg00036.html
答案 2 :(得分:1)
由于将32位目标文件与64位MPICH库链接,我遇到了类似的问题。与32位libmpi.a链接解决了这个问题。
答案 3 :(得分:0)
我和mingw有类似的问题:对于那些带有.lib结尾的库文件,我不得不把库的名称放在没有结尾的地方(例如-llibboost_system-mgw34-mt,当文件名为libbboost_system-mgw34-mt时的.lib)。对于.a结尾的库文件,我必须放置库的名称,不包括起始“lib”和尾随.a(例如libws2_32.a的-lws2_32)。
所以在你的情况下 - 尝试-llibmpi(或者在没有.lib结尾的情况下调用你的文件),也许是同样的问题。
来自:http://www.mingw.org/node/98/revisions/358/view
注意:某些路径以“/”作为路径分隔符打印,而其他路径以“\”作为路径分隔符打印。当MinGW GCC接受两者时,我用“/”代替所有。
所以我不会花太多时间去寻找纠正路径分离器的方法。你的图书馆是为mingw编译的吗?