ld: нераспознанная опция '--push-state - без необходимости " - PullRequest
0 голосов
/ 25 апреля 2018

Сбой моей сборки со следующим сообщением об ошибке компоновщика:

СБОЙ:: && / usr / bin / g ++ -Wall -Wextra -Werror -g -fsanitize = undefined, адрес -Wno-unused-параметр -fsanitize = undefined, адрес -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 - без необходимости "

Вы можете увидеть полный журнал сборки здесь . Ошибка в строке 2211, а версии напечатаны в строках 2104ff.

Какой инструмент вызывает ошибку?

  • Использует ли gcc 7.3.0 неправильный флаг компоновщика? Документация ld указывает, что --push-state и --no-as-needed являются отдельными командами.
  • ld 2.28 слишком стар, чтобы понять флаг компоновщика? журнал изменений не содержит ничего похожего.
  • Команда && /usr/bin/g++ выглядит странно, она должна быть /usr/bin/g++. Использование make вместо ninja показывает ту же ошибку компоновки.

Он правильно построен на тестировании Debian, в котором также используются gcc 7.3.0 и ld 2.30, но, похоже, не работает binutils-2.30 ppa для Ubuntu Trusty.

Как мне успешно построить мой проект на Travis?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Если опция 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

0 голосов
/ 15 мая 2018

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) бионический;срочность = средняя

  • Обновление до SVN 20180415 (r259389) из gcc-7-branch.
    • Fix PR libstdc ++ / 85222.
  • Удалите наш собственный PR-каталог libstdc ++ / 85222.

Обновление:

GCC 7 ( 7.3.0-16ubuntu3 ) is все еще не работает в Ubuntu 16.04 и более ранних.

Что вы можете сделать, чтобы обойти это:

A.Обновление до Ubuntu 18.04

Проблема устранена на Ubuntu 18.04 (LTS) Gcc7.


B.Dockerize и обновление до Ubuntu 18.04

Если обновление невозможно, например.работающий в системе CI, все еще можно использовать Docker и новейшую Ubuntu.


C.Отключить UB Sanitizer

Проблема возникает только при использовании GCC7 с включенным UB Sanitizer.Как отмечено в комментариях Тобиас-Брюль : Выключение UB Sanitizer предотвращает ошибку.


D.Используйте Gold Linker

Другой обходной путь, опубликованный makerj : Использование Gold Linker не вызывает проблемы.

Например.на CMake передать его через CMAKE_EXE_LINKER_FLAGS:

cmake -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=gold ..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...