Ich habe gcc 4.8.1 auf meinem Desktop heruntergeladen und gebaut, auf dem 64-Bit Ubuntu 12.04 läuft. Ich habe es aus der Quelle erstellt, wie es die Dokumente empfehlen, und mit den Befehlen
%Vor%Es schien alle Tests zu bestehen, und ich habe alles in meinem Home-Verzeichnis mit dem Suffix -4.8 installiert, um es vom System gcc zu unterscheiden, welches Version 4.6.3 ist.
Leider, wenn ich c ++ - Programme mit g ++ - 4.8 kompiliere, verlinkt es auf das System libc und libstdc ++ anstatt auf die neueren, die aus gcc-4.8.1 kompiliert wurden. Ich habe gcc 4.8 heruntergeladen und gebaut, weil ich mit den neuen C ++ 11-Funktionen in der Standardbibliothek spielen wollte, also ist dieses Verhalten definitiv nicht das, was ich wollte. Was kann ich tun, damit gcc-4.8 automatisch mit den mitgelieferten Standardbibliotheken und nicht mit den Systemstandardbibliotheken verknüpft wird?
Wenn Sie mit Ihrem eigenen gcc verlinken, müssen Sie einen zusätzlichen Laufzeit-Linker-Suchpfad (n) mit -Wl,-rpath,$(PREFIX)/lib64
hinzufügen, damit er zur Laufzeit die gemeinsamen Bibliotheken findet, die Ihrem gcc entsprechen.
Normalerweise erstelle ich einen Wrapper namens gcc
und g++
im gleichen Verzeichnis wie gcc-4.8
und g++-4.8
, die ich anstelle von gcc-4.8
und g++-4.8
aufruft, wie in Dynamischer Linker kann GCC-Bibliotheken nicht finden :
Bei der Installation von SUFFIX
und% sollte co_de% durch das ersetzt werden, was an PREFIX
übergeben wurde:
( configure
ist das Bash-Snippet).
Die obige Lösung funktioniert nicht mit einigen Versionen von gcc-wrapper.sh
, weil libtool
den Verbindungsmodus voraussetzt und mit einem Fehler ausfällt.
Eine bessere Lösung ist die Verwendung der Spezifikationsdatei. Sobald gcc / g ++ erstellt wurde, rufen Sie den folgenden Befehl auf, um gcc / g ++ hinzuzufügen, fügen Sie g++ -Wl,... -v
in die Linker-Befehlszeile ein (ersetzen Sie -rpath
nach Bedarf):
Ich hatte gerade das gleiche Problem beim Erstellen von gcc-4.8.2. Ich habe keinen Root-Zugriff auf diesem Computer und muss daher in meinem Home-Verzeichnis installieren. Es hat einige Versuche gebraucht, bis ich herausgefunden habe, welche Magie benötigt wird, um das zu erreichen, also werde ich es hier reproduzieren, damit andere Leute es leichter haben. Dies sind die Befehle, die ich verwendet habe, um gcc:
zu konfigurieren %Vor%Das brachte mir eine funktionierende Binärdatei, aber jedes Programm, das ich mit dieser Version von g ++ erstellte, würde nicht korrekt laufen, wenn ich es nicht mit der Option -Wl, -rpath, $ prefix / lib64 erstellt hätte. Es ist möglich, dass g ++ automatisch diese Option hinzufügt, indem es eine Spezifikationsdatei bereitstellt. Wenn Sie
ausführen %Vor%Sie können sehen, welche Verzeichnisse nach einer Spezifikationsdatei durchsucht werden. In meinem Fall war es $ prefix / lib / gcc / x86_64-unbekannt-linux-gnu / 4.8.2 / specs, also habe ich g ++ -dumpspecs ausgeführt, um eine neue specs-Datei zu erstellen:
%Vor%und dann diese Datei bearbeitet, um die Option -rpath bereitzustellen. Suche nach den Zeilen wie folgt:
%Vor%und bearbeiten, um die rpath-Option hinzuzufügen:
%Vor%Das% M wird abhängig davon, ob Sie eine 32-Bit- oder eine 64-Bit-ausführbare Datei erstellen, entweder auf ../lib oder ../lib64 erweitert.
Beachten Sie, dass es nicht funktionierte, wenn ich diesen Trick an einem älteren gcc-4.7-Build ausprobierte, weil dadurch% M nicht erweitert wurde. Für ältere Versionen können Sie das% M entfernen und nur lib oder lib64 hardcodieren, aber das ist nur eine praktikable Lösung, wenn Sie nur ausführbare 32-Bit-Dateien (mit lib) oder 64-bit-ausführbare Dateien (mit lib64) erstellen. p>
gcc -print-search-dirs
sagt Ihnen, wo Ihr Compiler nach Laufzeitbibliotheken usw. sucht. Sie können dies mit der Option -B<prefix>
überschreiben.