【问题标题】:ld: unrecognized option '--push-state--no-as-needed'ld:无法识别的选项“--push-state--no-as-needed”
【发布时间】: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 是否使用了不正确的链接器标志? 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 上成功构建我的项目?

【问题讨论】:

  • 我可以使用 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


【解决方案1】:

如果选项 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

【讨论】:

    【解决方案2】:

    GCC 7 已固定7.3.0-16ubuntu3(在 Ubuntu 18.04 上测试)。此版本可通过 Ubuntu Toolchain Test PPA 获得(适用于 16.04.1 和 14.04)。

    仅使用 Make 进行测试,但它也应该适用于 Ninja。消毒剂 ASan 和 UBsan 均已启用。

    changelog 中与此问题没有太大关系:

    gcc-7 (7.3.0-16ubuntu3) 仿生;紧急=中等

    • 从 gcc-7-branch 更新到 SVN 20180415 (r259389)。
      • 修复 PR libstdc++/85222。
    • 删除我们自己的 PR libstdc++/85222 反向移植。

    更新:

    GCC 7 (7.3.0-16ubuntu3)Ubuntu 16.04 和早点

    你可以做些什么来解决这个问题:

    A.更新到 Ubuntu 18.04

    问题已在 Ubuntu 18.04 (LTS) 的 Gcc7 上得到解决。


    B. Dockerize 并更新到 Ubuntu 18.04

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


    C.禁用 UB Sanitizer

    只有在启用 UB Sanitizer 的情况下使用 GCC7 时才会出现此问题。正如 tobias-brüll 在 cmets 中指出的那样:Turning UB Sanitizer off 可以防止错误。


    D.使用黄金链接器

    makerj 发布的另一个解决方法:使用 Gold Linker 不会导致问题。

    例如。在 CMake 上通过 CMAKE_EXE_LINKER_FLAGS:

    cmake -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=gold ..
    

    【讨论】:

    • 怎么了here?看起来它正在使用您链接的 ppa,但错误仍然存​​在。
    • 似乎它仅在 Ubuntu 18.04 上修复。这真的很糟糕。我已经相应地更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 2015-10-09
    • 2021-06-22
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2014-08-21
    相关资源
    最近更新 更多