代码之家  ›  专栏  ›  技术社区  ›  suszterpatt

MinGW链接器找不到MPICH2库

  •  4
  • suszterpatt  · 技术社区  · 17 年前

    MPICH2安装在C:\Program Files\MPICH2中。有两个子目录(感兴趣), \include \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
    

    这给了我很大的压力 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
    

    显然,链接器添加了一个 / \ 我提供给它的目录名(查找 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
    

    但我还是一样 符号未找到 错误。

    4 回复  |  直到 13 年前
        1
  •  3
  •   Jarekczek    14 年前

    海湾合作委员会 找到你的图书馆。否则,它将报告: cannot find -lmpi .

    找不到例程 在那个图书馆里。我用以下语法编译了一个示例:

    g++ -I../include cpilog.c ../lib/mpi.lib ../lib/mpe.lib
    

    移除后 libmpi.a

    g++ -I../include -L../lib cpilog.c -lmpi -lmpe
    
        2
  •  1
  •   ax. Clement Herreman    17 年前

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

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

    编辑:re:“未定义对‘MPI_Comm_rank’的引用”:是否可能是因为您混淆了/使用了c和/而不是c++? MPI_Comm_rank seems to be c绑定—c++绑定将是 MPI::Comm::Get_rank() . 也许可以尝试将程序编译为c,或者,如果您想使用c++,可以使用适当的绑定(请参阅 cxxpi.cpp 在示例中(dir)?

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

        3
  •  1
  •   Pawel Kowal    13 年前

        4
  •  0
  •   Tobias Langner    17 年前

    我对mingw也有类似的问题:对于那些以.lib结尾的库文件,我必须将库的名称放在没有结尾的地方(例如,-llibboost_system-mgw34-mt,当文件名为libbboost_system-mgw34-mt.lib时)。对于以.a结尾的库文件,我必须输入库的名称,不包括起始的“lib”和尾随的.a(例如,libws2_32.a的-lws2_32)。

    因此,在您的示例中-try-llibmpi(或者调用任何没有.lib结尾的文件),可能是同一个问题。


    发件人: http://www.mingw.org/node/98/revisions/358/view

    注意:某些路径使用/作为路径分隔符打印,而另一些路径使用\作为路径分隔符打印。我已经用/代替了所有的内容。

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

    推荐文章