【发布时间】:2018-10-06 01:48:56
【问题描述】:
我的构建失败并显示以下链接器错误消息:
失败: : && /usr/bin/g++ -Wall -Wextra -Werror -g -fsanitize=undefined,address -Wno-unused-parameter -fsanitize=undefined,address -rdynamic *.o -o SCE -Wl, -rpath,/opt/qt59/lib /opt/qt59/lib/libQt5Widgets.so.5.9.1 /usr/local/lib/libprotobuf.a -lpthread -lutil -lgrpc++ /opt/qt59/lib/libQt5Gui.so。 5.9.1 /opt/qt59/lib/libQt5Core.so.5.9.1 && :
/usr/bin/x86_64-linux-gnu-ld: 无法识别的选项 '--push-state--no-as-needed'
你可以看到the full build log here。错误在第 2211 行,版本在第 2104ff 行打印。
哪个工具导致错误?
-
gcc 7.3.0是否使用了不正确的链接器标志?lddocumentation 表示--push-state和--no-as-needed是单独的命令。 -
ld 2.28是否太旧而无法理解链接器标志? change log 没有列出任何似乎相关的内容。 - 命令
&& /usr/bin/g++看起来很奇怪,应该是/usr/bin/g++。使用make而不是ninja会显示相同的链接错误。
它在使用 gcc 7.3.0 和 ld 2.30 的 Debian 测试上正确构建,但似乎没有适用于 Ubuntu Trusty 的 binutils-2.30 ppa。
如何在 Travis 上成功构建我的项目?
【问题讨论】:
-
我可以使用 CMake(make 和 ninja)在 Ubuntu 16.04 上使用 Gcc7 确认这一点。 Gcc6 和 Clang 4-6 工作正常; Gcc7 在本地也能正常工作(Arch)。
-
开启未定义行为消毒剂似乎“解决”了这个问题。很可能是 g++ 中的错误。
-
简单的解决方法是通过将
-fuse-ld=gold选项传递给gcc 来使用gold 链接器 -
@makerj 这确实有效。考虑将其作为答案。
-
如果您只使用
-fsanitize=undefined,另一个似乎有帮助的解决方法:如果您告诉编译器在运行时捕获,则不需要链接到消毒剂:-fsanitize-undefined-trap-on-error。
标签: gcc ubuntu-14.04 linker-errors ld