Ma construction échoue avec le message d'erreur suivant de l'éditeur de liens:
FAILED: &&/usr/bin/g ++ -Wall -Wextra -Werror -g -fsanitize = undefined, adresse -Wno-Miller-Parameter -fsanitize = undefined, adresse -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.1.1 /opt/qt59/lib/libQt5Core.so.5.9.1 &&:
/usr/bin/x86_64-linux-gnu-ld: option non reconnue '--Push-state - no-as-required'
Vous pouvez voir le journal de construction complet ici . L'erreur est à la ligne 2211 et les versions sont imprimées aux lignes 2104ff.
Quel outil provoque l'erreur?
gcc 7.3.0
utilise un indicateur d'éditeur de liens incorrect? La documentation ld
indique que --Push-state
et --no-as-needed
sont des commandes distinctes.ld 2.28
est-il trop ancien pour comprendre le drapeau de l'éditeur de liens? Le change log ne répertorie rien qui semble être lié.&& /usr/bin/g++
a l'air bizarre, elle devrait être /usr/bin/g++
. Utiliser make
au lieu de ninja
montre la même erreur de liaison.Il repose correctement sur les tests Debian qui utilisent également gcc 7.3.0
et ld 2.30
, mais il ne semble pas exister de binutils-2.30
ppa fonctionnel pour Ubuntu Trusty.
Comment construire avec succès mon projet sur Travis?
GCC 7 est corrigé avec 7.3.0-16ubuntu3 (testé sur Ubuntu 18.04). Cette version est disponible via le Ubuntu Toolchain Test PPA (pour 16.04.1 et 14.04).
Testé uniquement avec Make, mais il devrait également fonctionner avec Ninja. Sanitizer, ASan et UBsan, activés.
Il n'y a pas beaucoup de problèmes liés à ce problème dans le changelog quoique:
gcc-7 (7.3.0-16ubuntu3) bionique; urgence = moyenne
- Mise à jour du fichier SVN 20180415 (r259389) à partir de la branche gcc-7 .
- Correction PR libstdc ++/85222.
- Supprimez notre propre backport PR libstdc ++/85222.
GCC 7 (7.3.0-16ubuntu3) est toujours cassé sur Ubuntu 16.04 et versions antérieures.
Que pouvez-vous faire pour contourner ce problème:
Le problème est résolu sur Ubuntu 18.04 (LTS) 'Gcc7.
Si une mise à jour n'est pas possible, par exemple. fonctionnant sur un système CI, il est toujours possible d’utiliser Docker et d’un Ubuntu à jour.
Le problème ne se produit que lorsque vous utilisez GCC7 avec UB Sanitizer activé. Comme tobias-brüll noté dans les commentaires: Tourner le UB Sanitizer désactivé empêche l'erreur.
Une autre solution de contournement publiée par makerj : L'utilisation de Gold Linker ne pose pas le problème.
Par exemple. sur CMake transmettez-le à travers le CMAKE_EXE_LINKER_FLAGS
:
cmake -DCMAKE_EXE_LINKER_FLAGS=-Fuse-ld=gold ..
Si l'option D (de la réponse de ollo ) ne fonctionne pas, essayez les commandes suivantes:
Sudo add-apt-repository ppa:jonathonf/binutils --yes
Sudo apt-get update -qq --yes
Sudo apt-get install -qq --yes --force-yes binutils
C'est à partir de: https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/travis/before_install.x86_64-asan.sh
Et le problème a été décrit ici: https://github.com/Project-OSRM/osrm-backend/issues/3216