4

MPICH2 安装在 C:\Program Files\MPICH2 中。有两个子目录(感兴趣的),\include一个包含 .h 文件,\lib另一个包含 .lib 文件。

MPICH2 附带的自述文件有以下说明:

  1. 创建一个生成文件
  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

undefined reference这给了我代码中每个 MPI 符号的一大堆错误。我花了几个小时试图修复它,杂耍-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

显然,链接器将 a/而不是 a添加\到我提供给它的目录名称中(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错误。

4

4 回答 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
于 2012-09-21T07:03:54.890 回答
1

尝试添加(用于 c++ 绑定的库) -lmpicxx并确保-l...在cpp 源文件 *. 这对我有用:

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

编辑:回复:“对'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

于 2009-08-29T18:32:16.653 回答
1

将 32 位目标文件与 64 位 MPICH 库链接时,我遇到了类似的问题。与 32 位 libmpi.a 链接解决了这个问题。

于 2013-02-11T03:46:20.830 回答
0

我对 mingw 有类似的问题:对于那些以 .lib 结尾的库文件,我必须输入没有结尾的库名称(例如,当文件名是 libbboost_system-mgw34-mt.lib 时 -llibboost_system-mgw34-mt) . 对于以 .a 结尾的库文件,我必须输入库的名称,不包括开头的“lib”和结尾的 .a(例如 -lws2_32 用于 libws2_32.a)。

所以在你的情况下 - 尝试 -llibmpi (或任何你的文件被称为没有 .lib 结尾),也许这是同一个问题。


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

注意:有些路径用“/”作为路径分隔符打印,而另一些路径用“\”作为路径分隔符打印。我已经用“/”替换了所有内容,因为 MinGW GCC 都接受了。

所以我不会花太多时间来寻找纠正路径分隔符的方法。你的库是为 mingw 编译的吗?

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

于 2009-08-31T14:44:55.890 回答