Frage

Ich habe ein Problem in Bezug auf libstdc++.so.

Ich installierte eine neue Version von gcc und versuchte, C ++ Code zu kompilieren. Die Compilierung gearbeitet, aber wenn ich versuche, die binären auszuführen (m5.opt ist sein Name) Ich habe die folgende Fehlermeldung anzeigt:

build/ALPHA_SE/m5.opt: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by build/ALPHA_SE/m5.opt).

Muss ich libstdc++.so ersetzen? Und wenn ja, wo kann ich die Version herunterladen ich will? Auf der GCC-Website, die sie sagen libstdc ++ jetzt ein Teil von gcc ist.

Details

GCC: Ich hatte gcc 4.1.2 vor, aber ich heruntergeladen gcc 4.2.4. Vom untarred gcc-Verzeichnis I ./configure ausgeführt; machen; sudo make install`. Als ich versuchte, gcc zu verwenden oder g ++ zu kompilieren, war es der Standard-Version noch 4.1.2. Um dies zu überwinden ersetzt wir einige Links:

mv /usr/bin/gcc /usr/bin/gcc_bak
ln -s /usr/local/bin/gcc gcc
mv /usr/bin/g++ /usr/bin/g++_bak
ln -s /usr/local/bin/g++ g++

GLIBC (++) - libstdc ++:

/usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.8
/usr/local/lib/libstdc++.so -> libstdc++.so.6.0.9
/lib/libc.so.6 -> libc-2.5.so -> libc-2.5.so

Linux-Version: uname -a gibt:

Linux madmax 2.6.18-128.4.1.el5 #1 SMP Tue Aug 4 12:51:10 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

War es hilfreich?

Lösung

Das Problem ist, dass Sie Ihr neues GCC falsch gebaut: auf Linux sollten Sie verwenden

./configure --prefix=/usr

Der Standardinstallations Präfix ist /usr/local, weshalb make install Put gcc und g++ Binärdateien in /usr/local/bin, etc.

Was passiert mit Ihnen jetzt, dass Sie kompilieren und verknüpfen die neue (Symlink) GCC 4.2.4 verwenden, sondern zur Laufzeit Ihr Programm bindet an die alte /usr/lib64/libstdc++.so.6 (Version 6.0.8, statt erforderlich 6.0.9). Sie können das bestätigen, indem Sie ldd build/ALPHA_SE/m5.opt. Sie sollten sehen, dass es /usr/lib64/libstdc++.so.6 verwendet

Es gibt mehrere Fixes Sie tun können.

env LD_LIBRARY_PATH=/usr/local/lib64 ldd build/ALPHA_SE/m5.opt

Sie sollten zeigen, dass LD_LIBRARY_PATH Einstellung ausreichend ist, um die binäre richtige Bibliothek zu umleiten, und

LD_LIBRARY_PATH=/usr/local/lib64 build/ALPHA_SE/m5.opt

sollte nur laufen. Sie könnten „backen“ dieser Weg in m5.opt binären indem sie sie mit -Wl,-rpath=/usr/local/lib64 Neuverknüpfung.

Eine dauerhafte Lösung ist die Bibliotheken die gleiche Art und Weise zu beheben Sie die Binärdateien festgelegt:

cd /usr/lib64 && mv libstdc++.so.6 libstdc++.so.6_bak &&
ln -s /usr/local/lib64/libstdc++.so.6 .

Eine noch bessere Lösung ist es, den neuen GCC mit --prefix=/usr neu zu konfigurieren, und dann make all install.

Andere Tipps

Ich weiß, das ist eine sehr alte Frage, aber ...

Es ist nicht in der Regel eine gute Idee, um das System-Compiler (das heißt, die eine in /usr), da das gesamte System zu ersetzen, wird mit ihm und von ihm abhängig gebaut wurden.

Es ist in der Regel besser, den neuen Compiler zu einem anderen Ort zu installieren und sieht dann die libstdc ++ FAQ Wie kann ich versichern, dass die dynamisch verknüpfte Bibliothek gefunden werden? und Finding dynamische oder Shared Libraries im Handbuch, wie die richtige libstdc ++ zu gewährleisten. so zur Laufzeit zu finden ist.

Die anderen Antworten hier sollen in Ordnung sein, aber die ‚schnelle und einfache‘ Lösung, wenn Sie geschehen, gcc / usr / local installiert hat / ist nur noch die neue Libs zum LD_LIBRARY_PATH hinzufügen

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

Sie können auch die überprüfen, um zu sehen, ob Sie die richtigen Versionen von glibc installiert mit

strings /usr/lib/libstdc++.so.6 | grep GLIBC
strings /usr/local/lib64/libstdc++.so.18 | grep GLIBC

Ich habe diese letzte Spitze aus einem anderen Forum so Kredite aufgrund wo Kredite fällig!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top