MinGW链接器无法找到MPICH2库。

4
MPICH2已安装在C:\Program Files\MPICH2中。有两个子目录(值得关注),\include包含.h文件,\lib包含.lib文件。
随MPICH2一起提供的自述文件包含以下说明:
  1. 创建一个makefile
  2. 添加–I...mpich2\include
  3. 添加–L...mpich2\lib
  4. 添加–lmpi
  5. 添加源文件规则
  6. 编译
由于我的项目中没有其他规则,因此我不创建makefile,而是直接在命令行中尝试这样编译:
g++ -I"C:\Program Files\MPICH2\include" main.cpp -L"C:\Program Files\MPICH2\lib" -lmpi

这导致每个MPI符号中的undefined reference错误,我在尝试修复它的过程中花了几个小时,围绕-I-L-l开关,调整参数的顺序,甚至将所有.lib文件复制到与我的源代码相同的目录中,但似乎没有任何作用。
需要什么样的巫术才能使这个东西链接起来?
编辑:我认为我找到了问题所在:这里是链接器详细模式下的输出摘录(在编译命令中添加-W1,--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错误。

能否提供编译器/链接器日志? - ax.
其实没有什么可看的,只是像这样的几十行代码:C:\Users\Bansaghi\AppData\Local\Temp/ccIF61Uc.o:main.cpp:(.text+0x1615): undefined reference to 'MPI_Comm_rank' - suszterpatt
4个回答

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

尝试添加-lmpicxx(C++绑定的库),并确保-l...在cpp源文件*之后。这对我有效:

g++ -Iinclude -Llib test/cxxpi.cpp -lmpicxx -lmpi

编辑:关于“undefined reference to 'MPI_Comm_rank'”:你是否混淆了使用c和/而不是c++?MPI_Comm_rank似乎是c绑定- c++绑定应该是MPI::Comm::Get_rank()。也许尝试将程序编译为c,或者如果你想使用c ++,请使用正确的绑定(参见示例目录中的cxxpi.cpp)?

* http://newsgroups.derkeiler.com/Archive/Comp/comp.parallel.mpi/2006-08/msg00036.html


即使我添加了每个库并按照您编写的顺序放置所有参数,仍然会出现相同的“未定义引用”错误。 - suszterpatt
你看到我关于C和C++绑定的编辑了吗?另外,尝试使用正斜杠、相对路径,并且路径名中没有空格。例如,将你的源代码放入“C:\Program Files\MPICH2\sc”中,并在编译时使用-I../include -L../lib等参数。最终,这对我来说是有效的... - ax.
哦,顺便说一下:链接器会寻找libmpi.a和(如果是C++)libmpicxx.a - 这就是为什么要使用-lmpicxx -lmpi。 - ax.

1

我遇到了类似的问题,由于将32位目标文件与64位MPICH库链接而导致。与32位libmpi.a链接解决了该问题。


0
我曾经遇到过与mingw类似的问题:对于那些以.lib结尾的库文件,我必须将库的名称放在没有结尾的情况下(例如,当文件名为libbboost_system-mgw34-mt.lib时,-llibboost_system-mgw34-mt)。对于以.a结尾的库文件,我必须将库的名称排除掉开头的“lib”和结尾的“.a”(例如,对于libws2_32.a,-lws2_32)。
所以在你的情况下,请尝试-llibmpi(或者无论你的文件叫什么,都不要带上.lib结尾),也许是同样的问题。

来自:http://www.mingw.org/node/98/revisions/358/view

注意:有些路径使用“/”作为路径分隔符打印,而有些则使用“\”作为路径分隔符打印。我已将所有路径替换为“/”,因为MinGW GCC接受两者。

因此,我不会花太多时间找到纠正路径分隔符的方法。你的库是否编译为mingw?

也许:http://www.mingw.org/wiki/LibraryPathHOWTO可以帮助你更进一步。


显然,链接器尝试了各种格式,但是创建了错误的路径:请参见我在问题中的编辑。 - suszterpatt
请问 mpi 库文件的名称是什么?是 libmpi.a 还是 libmpi.lib?这很重要,因为如果您想链接到 libmpi.lib 文件,您需要使用 -llibmpi 而不是 -lmpi。 - Tobias Langner
文件没有 lib 前缀,而是以 .lib 为扩展名。例如 mpi.libcxx.lib。从上面的详细输出中可以看出,选项 -lmpi 应该尝试查找一个 mpi.lib(如摘录中的第4行所示)。 - suszterpatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接