collect2.exe: error: ld返回了5个退出状态

11

我最近更新了所有msys2软件包,现在无法构建我的项目。错误出现在链接一个.dll文件的时候 - target_library.dll

对我来说,错误信息不够清晰。状态5是什么意思?

collect2.exe: error: ld returned 5 exit status

完整信息:

g++ -Wl,-s,--relax,--gc-sections -shared -Wl,-subsystem,windows -mthreads -Wl,--out-implib,C:/msys64/workspace/Project_Root_Directory/project/src/../build/release/plugins/libtarget_library.dll.a -o ../../../../build/release/plugins/target_library.dll object_script.target_library.Release  -lglu32 -lopengl32 -luser32 -LC:/msys64/workspace/Project_Root_Directory/project/build/release -LC:/msys64/workspace/Project_Root_Directory/project/third-party/out/lib -LC:/msys64/workspace/Project_Root_Directory/project/deps/lib -lexif -ldecimal -lsqlite3 -lutils -LC:/Python35/libs -lpython35 -lkmlbase -lkmlengine -lkmldom -lkmlxsd -lminizip -luriparser -lkmlconvenience -lcore -lrender -lraster -lgui -LC:/msys64/workspace/Project_Root_Directory/project/deps/lib/target_library/win64 -LC:/msys64/mingw64/lib  C:/msys64/mingw64/lib/libQt5Widgets.dll.a C:/msys64/mingw64/lib/libQt5WinExtras.dll.a C:/msys64/mingw64/lib/libQt5Gui.dll.a C:/msys64/mingw64/lib/libQt5Network.dll.a C:/msys64/mingw64/lib/libQt5Concurrent.dll.a C:/msys64/mingw64/lib/libQt5Xml.dll.a C:/msys64/mingw64/lib/libQt5Core.dll.a

collect2.exe: error: ld returned 5 exit status
make[4]: *** [Makefile.Release:159: ../../../../build/release/plugins/target_library.dll] Error 1
make[4]: Leaving directory '/workspace/Project_Root_Directory/project/src/modules/plugins/target_library'
make[3]: Leaving directory '/workspace/Project_Root_Directory/project/src/modules/plugins/target_library'
make[2]: *** [Makefile:384: sub-target_library-make_first] Error 2
make[2]: Leaving directory '/workspace/Project_Root_Directory/project/src/modules/plugins'
make[1]: *** [Makefile:297: sub-plugins-make_first] Error 2
make[1]: Leaving directory '/workspace/Project_Root_Directory/project/src/modules'
make: *** [Makefile:44: sub-modules-make_first] Error 2

gcc 7.1.0,Qt5 5.9.1,qmake,Win7 x64


你还没有发布链接器错误诊断信息,只有“那没用。再见”结尾。请发布从失败的 g++ ... 命令开始到结束的完整构建日志。 - Mike Kinghan
@MikeKinghan 完整的构建日志超过12Mb。这是一个庞大的项目。我想链接命令本身就足够了。 - Andrei Smeltsov
请提供完整的构建日志,从失败的 g++ ... 命令开始到上面的结尾。 - Mike Kinghan
@MikeKinghan 链接失败。这在原始帖子中有提到。在此之前,有一堆目标文件被成功创建。 - Andrei Smeltsov
1
我认为很多人点赞这篇文章是因为我们之前听说过或者遇到过这个错误。是的,有时候ld会在没有给出错误信息的情况下失败。也许你应该考虑使用不同的编程环境。但如果你真的想修复MSYS2,我建议你尽可能地减少测试用例。理想情况下,你只需要从几个简单的源文件开始,运行一些GCC命令来产生错误。然后你可以使用“-v”来查看“gcc”是如何调用“ld”的,你也可以自己调用它。你可以使用gdb(带有调试版本的“ld”)来调试“ld”。 - David Grayson
@DavidGrayson 这是一个好建议。谢谢。 - Andrei Smeltsov
3个回答

5

我遇到了同样的问题。 我将我的项目与静态库链接。 在mingw64升级后,我的项目出现了相同的构建错误。 我发现调试版本成功构建。因此,我比较了链接器标志。在发布版本中,Qt添加了这些标志 "-Wl,-s,--relax,--gc-section"。 我找不到有关“-s”标志的任何信息,但由于这个链接,我发现-gc-section标志是失败的原因。 我将以下代码添加到我的.pro文件中,它就可以工作了。

mingw {
        contains(QT_ARCH, x86_64): {
            LIBS+=-Wl,--no-gc-sections
        }
}

显然,那正是它。 - Andrei Smeltsov
很奇怪。那个链接对我来说没问题,但之后却拒绝运行。加上 QT += widgets 对我有帮助。 - parvus

3

如果有人遇到相同的问题,请在编译器中加入以下标志 -Wl,--verbose(或者 --verbose 给链接器)。这将显示哪个库未找到,或提供关于问题的更多信息。


有趣的是,将 --verbose 添加到链接器中对我来说修复了错误。如果我再次将其删除,错误就会再次出现。xD - Jeronimo

0
我遇到了与自定义GCC构建相同的问题。 我通过在不同的机器上进行不同的测试、调试和分析Windows生成的转储文件来分析这个问题。我找不到确切的原因,只能找到解决方法。我在这里贴出我积累的知识供参考。
  • 该问题仅影响Windows(MingW)构建
  • 受影响的版本:GCC 11.3.1,Binutils 2.40
  • g++移动到另一个目录似乎可以解决问题
  • 添加-Wl,-verbose可以解决问题
  • 使用gcc进行链接可以解决问题(只有g++受影响)

分析Windows生成的转储文件显示,失败的代码属于BinUtils中的ld/ldlang.c文件中的lang_size_sections_1方法。 enter image description here

enter image description here


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