Linker MinGW链接器可以';找不到MPICH2库

Linker MinGW链接器可以';找不到MPICH2库,linker,g++,mingw,Linker,G++,Mingw,MPICH2安装在C:\Program Files\MPICH2中。有两个子目录(感兴趣),\include包含.h文件,和\lib包含.lib文件 MPICH2附带的自述文件具有以下说明: 创建一个makefile 添加–I…mpich2\include 添加–L…mpich2\lib 添加–lmpi 添加源文件的规则 编撰 由于我的项目中没有其他规则,因此我不创建makefile,我只需转到命令行并尝试如下编译: g++ -I"C:\Program Files\MPICH2\include"

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

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

  • 创建一个makefile
  • 添加
    –I…mpich2\include
  • 添加
    –L…mpich2\lib
  • 添加
    –lmpi
  • 添加源文件的规则
  • 编撰
  • 由于我的项目中没有其他规则,因此我不创建makefile,我只需转到命令行并尝试如下编译:

    g++ -I"C:\Program Files\MPICH2\include" main.cpp -L"C:\Program Files\MPICH2\lib" -lmpi
    
    g++ -I"/Program Files/MPICH2/include" -L"/Program Files/MPICH2/lib" objManager.cpp ongom.cpp io.cpp main.cpp -lmpi -lcxx
    
    这使我在代码中的每个MPI符号上都出现了大量的
    未定义引用
    错误。我花了几个小时试图修复它,在
    -I
    -L
    -L
    之间切换,调整参数的顺序,甚至将所有.lib文件复制到与源代码相同的目录中,但似乎没有任何效果

    需要什么样的巫毒才能把这东西联系起来


    编辑:我想我发现了问题:下面是链接器在verbose模式下的输出摘录(将
    -Wl,--verbose
    添加到compile命令中):

    显然,链接器将一个
    /
    而不是
    \
    添加到我提供给它的目录名中(出于某种原因查找
    lib\uuuuuuuuuuuuuua.a
    格式时除外),这显然不是一个有效的路径。有没有办法告诉链接器使用反斜杠而不是斜杠

    这也引起了我的注意:

    attempt to open /mingw/lib/libmingwex.a succeeded
    
    所以我试着这样编译:

    g++ -I"C:\Program Files\MPICH2\include" main.cpp -L"C:\Program Files\MPICH2\lib" -lmpi
    
    g++ -I"/Program Files/MPICH2/include" -L"/Program Files/MPICH2/lib" objManager.cpp ongom.cpp io.cpp main.cpp -lmpi -lcxx
    

    但我仍然得到相同的<代码>未定义的引用< /代码>错误。

    尝试添加<代码> -LMPICX(C++绑定的库),并确保 -L.<…>代码>紧随CPP源文件*。这对我很有用:

    g++ -Iinclude -Llib test/cxxpi.cpp -lmpicxx -lmpi
    
    <>编辑:Re:“未定义的引用“MPIYCOMLQARE””:是不是你正在混合/使用C和/而不是C++?代码> MPIYCOMLCORMAREX/ C绑定-C++绑定将是 MPI::COM::GETYANKOR()/COD>。也许尝试编译你的程序作为C,或者,如果你想使用C++,使用正确的绑定(见代码> CXXPI .CPP < /代码>在例子DIR)?< /P>
    *

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

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


    发件人:

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

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


    也许:可以帮助您更进一步。

    GCC能够找到您的库。否则它将报告:
    找不到-lmpi

    不知何故,在该库中找不到例程。我用以下语法编译了一个示例:

    g++ -I../include cpilog.c ../lib/mpi.lib ../lib/mpe.lib
    
    不过我是在msys里面做的。我的目录不包含空格

    删除
    libmpi.a
    文件后,这也可以工作:

    g++ -I../include -L../lib cpilog.c -lmpi -lmpe
    

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

    介意发布编译器/链接器日志吗?真的没有什么可看的,只有几十行这样的代码:
    C:\Users\Bansaghi\AppData\Local\Temp/ccIF61Uc.o:main.cpp:(.text+0x1615):对“MPI\u Comm\u rank”的未定义引用。
    仍然得到相同的
    未定义引用
    错误,即使我添加了每个库,而且所有参数都和WROTEE完全一样。你读过我的编辑Re:C和C++绑定吗?另外,尝试使用正斜杠、相对路径,并且路径名中没有空格。例如,将您的源代码放入“C:\Program Files\MPICH2\sc”并使用-I../include-L../lib等。最后,它对我有效…哦,顺便说一下:链接器查找libmpi.a和(如果是C++)libmpicxx.a-这就是-lmpicxx-lmpi的原因。显然,链接器尝试各种格式,但是创建了错误的路径:请参见问题中的“我的编辑”。您能告诉我mpi库文件的名称吗?是libmpi.a还是libmpi.lib?这一点很重要,因为如果要链接到libmpi.lib文件,则需要-llibmpi而不是-lmpit。文件没有
    lib
    前缀,扩展名为
    .lib
    。e、 g.
    mpi.lib
    cxx.lib
    。查看上面的详细输出,选项
    -lmpi
    应该尝试查找
    mpi.lib
    (根据摘录中的第4行)。