我的构建失败,出现以下链接器错误消息:
失败:&& / usr / bin / g ++ -Wall -Wextra -Werror -g -fsanitize = undefined,address -Wno-unused-parameter -fsanitize = undefined,address -dynamic * .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
是否使用了错误的链接器标志? ld
documentation表示--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上成功构建我的项目?
答案 0 :(得分:5)
GCC 7 已修复 7.3.0-16ubuntu3(在 Ubuntu 18.04 上测试)。此版本可通过Ubuntu Toolchain Test PPA(适用于16.04.1和14.04)获得。
使用Make进行测试,但它也应该与Ninja一起使用。 Sanitizer,ASan和UBsan都启用了。
changelog中与此问题没有太大关系:
gcc-7(7.3.0-16ubuntu3)bionic;急=介质
- 从gcc-7-branch更新到SVN 20180415(r259389)。
- 修复PR libstdc ++ / 85222。
- 删除我们自己的PR libstdc ++ / 85222 backport。
GCC 7( 7.3.0-16ubuntu3 )在 Ubuntu 16.04上 仍然无法 较早强>
您可以采取哪些措施来解决此问题:
问题已在 Ubuntu 18.04(LTS) 的Gcc7上修复。
如果无法进行更新,例如。在CI系统上运行,仍然可以选择使用 Docker 和最新的Ubuntu。
只有在启用UB Sanitizer的情况下使用GCC7时才会出现问题。正如评论中提到的tobias-brüll: 转动 UB Sanitizer关闭 可防止错误。
makerj发布的另一种解决方法:使用 Gold Linker 不会导致此问题。
EG。在 CMake 上传递CMAKE_EXE_LINKER_FLAGS
:
cmake -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=gold ..
答案 1 :(得分:0)
如果选项D(来自ollo的答案)对您不起作用,请尝试以下命令:
sudo add-apt-repository ppa:jonathonf/binutils --yes
sudo apt-get update -qq --yes
sudo apt-get install -qq --yes --force-yes binutils
问题被描述在这里:https://github.com/Project-OSRM/osrm-backend/issues/3216