GLIBCXX_3.4.9 nicht gefunden
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
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!