Verknüpfung von g++ 4.8 libstdc++
Ich heruntergeladen und installiert gcc 4.8.1 auf meinem desktop mit 64-bit Ubuntu 12.04. Ich baute es aus der Quelle, wie die docs empfehlen, und mit den Befehlen
../../gcc-4.8.1/configure --prefix=$HOME --program-suffix=-4.8
make
make -k check
make install
Schien es zu passieren all die tests und installierte ich alles in meinem home-Verzeichnis w/suffix -4.8 zu unterscheiden von der system-gcc version 4.6.3.
Leider, wenn ich kompilieren von c++ - Programmen die Verwendung von g++-4.8 es links zu den system-glibc und libstdc++, lieber als die neueren, zusammengestellt, aus den gcc-4.8.1. Ich heruntergeladen und installiert gcc 4.8, da wollte ich spielen, um mit dem neuen C++11-features in der standard-Bibliothek, also das Verhalten ist definitiv nicht das, was ich wollte. Was kann ich tun, um das gcc-4.8 automatisch ein link zu den standard-Bibliotheken, die mit ihm kamen, anstatt die system-standard-Bibliotheken?
- libc ist nichts zu tun mit dem GCC, es gibt also keine "neuere Version, kompiliert mit gcc-4.8.1", es soll ein link auf die system-libc. Vermutlich, wenn Sie sagen, dass es links zu den system-libstdc++ du meinst es links korrekt, aber nicht ausgeführt, aufgrund falscher libstdc++ - version?
- Ja, das ist richtig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine Verknüpfung mit Ihrem eigenen gcc müssen Sie fügen Sie eine zusätzliche Laufzeit-linker-Suchpfad(s) mit
-Wl,-rpath,$(PREFIX)/lib64
so dass zur Laufzeit findet er die freigegebenen Bibliotheken entsprechend Ihrem gcc.Ich normalerweise erstellen Sie einen wrapper namens
gcc
undg++
im gleichen Verzeichnis wiegcc-4.8
undg++-4.8
die ich aufrufen stattgcc-4.8
undg++-4.8
, wie vorgeschrieben, in Dynamische linker ist nicht in der Lage zu finden, GCC-Bibliotheken:Beim installieren
SUFFIX
undPREFIX
ersetzt werden sollte mit dem, was war, vergangen zuconfigure
:(
gcc-wrapper.sh
ist, dass bash-snippet).Die oben genannte Lösung funktioniert nicht mit einigen Versionen von
libtool
weilg++ -Wl,... -v
übernimmt verknüpfen-Modus und bricht mit einer Fehlermeldung ab.Eine bessere Lösung ist die Verwendung specs-Datei. Einmal gcc/g++ gebaut ist, rufen Sie den folgenden Befehl gcc/g++ - add
-rpath
zu den linker-Befehl ein (ersetzen Sie${PREFIX}/lib64
wie nötig):LD_LIBRARY_PATH
ist auch die manuelle und unglaubwürdig für mich.lib
oderlib64
je nach multilib Ziel. Ich werde Graben Sie sich einige relevante links und E-Mails später ...LD_RUN_PATH
beim Bau meiner toolchain, also das hinzufügen weiterer patch ist einfach, aber ich schweife ab.g++ -dumpspecs
Befehl gilt nur für den Weg zu diesem besondereng++
gegen die Anwendung auf alleg++
auf das system, wenn Sie hatte es inLD_LIBRARY_PATH
?-rpath
an-linker-Befehle von diesem gcc. Nur die Binärdateien erzeugt, die von diesemgcc
betroffen sind.LD_LIBRARY_PATH
. gms.tf/ld_library_path-considered-harmful.htmlIch hatte gerade das gleiche problem beim erstellen von gcc-4.8.2. Ich habe keinen root Zugriff auf die Maschine und somit installieren müssen, um mein home-Verzeichnis. Es brauchte mehrere Anläufe, bevor ich herausfand, die Magie, die erforderlich sind, um diese zu arbeiten, also werde ich es reproduzieren hier, damit andere Leute es einfacher haben. Dies sind die Befehle, die ich verwendet, um zu konfigurieren, gcc:
Die mir ein arbeiten binären aber jedes Programm, das ich gebaut habe mit dieser version von g++ würde nicht richtig laufen, es sei denn, ich baute es mit die -Wl,-rpath,$prefix/lib64 option. Es ist möglich, die g++ automatisch hinzufügen", die option durch die Bereitstellung einer specs-Datei. Wenn Sie
können Sie sehen, welche Verzeichnisse überprüft die specs-Datei. In meinem Fall war es $prefix/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/specs so lief ich g++ -dumpspecs zum erstellen einer neuen specs-Datei:
und dann bearbeitet die Datei zu liefern -rpath-option. Suchen Sie nach den Zeilen, wie diese:
Bearbeiten und hinzufügen der option rpath:
Den %M erweitert, um entweder ../lib oder ../lib64 je nachdem, ob Sie eine 32-bit-oder eine 64-bit-Programm.
Beachten Sie, dass, wenn ich versuchte, diese gleichen trick an einem älteren gcc-4.7 bauen, es hat nicht funktioniert, weil Sie nicht erweitern Sie die %M. Für ältere Versionen können Sie das "%M " und nur hardcode lib oder lib64 aber das ist nur eine tragfähige Lösung, wenn Sie immer nur bauen 32-bit-Programme (mit lib) oder immer nur bauen 64-bit-Programme (mit lib64).
LD_LIBRARY_PATH
finden Sie unter stackoverflow.com/a/10662297/981959gcc -print-search-dirs
sagt dir, wo dein compiler ist auf der Suche nach runtime-Bibliotheken, etc. Sie können dies überschreiben, mit der-B<prefix>
option.-B
kann das nicht ändern-rpath
Optionen, es wird nur die erstelibstdc++.x.so
in der ld.also cache, oderLD_LIBRARY_PATH
Recht? Wenn ich zu oft und zu lange auf SO, ich Neige zu tunnel vision.