ld:无法识别的选项' - 推送状态 - 不按需要'

时间:2018-04-25 14:22:50

标签: gcc ubuntu-14.04 linker-errors ld

我的构建失败,出现以下链接器错误消息:

  

失败:&& / 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.0ld 2.30的Debian测试中正确构建,但对于Ubuntu Trusty来说似乎没有工作binutils-2.30 ppa。

如何在Travis上成功构建我的项目?

2 个答案:

答案 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

问题已在 Ubuntu 18.04(LTS) 的Gcc7上修复。

B中。 Dockerize并更新到Ubuntu 18.04

如果无法进行更新,例如。在CI系统上运行,仍然可以选择使用 Docker 和最新的Ubuntu。

℃。禁用UB Sanitizer

只有在启用UB Sanitizer的情况下使用GCC7时才会出现问题。正如评论中提到的tobias-brüll 转动 UB Sanitizer关闭 可防止错误。

d。使用Gold Linker

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/blob/master/scripts/travis/before_install.x86_64-asan.sh

问题被描述在这里:https://github.com/Project-OSRM/osrm-backend/issues/3216