/usr/lib/libstdc++.so.6: Version `GLIBCXX_3.4.15 'nicht gefunden

135

Wie kann ich GLIBCXX_3.4.15 in Ubuntu bekommen? Ich kann einige Programme, die ich kompiliere, nicht ausführen.

Wenn ich es tue:

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

Ich bekomme:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

Vielen Dank für jede Hilfe!

Chris
quelle

Antworten:

81

Ich kompiliere gcc 4.6 aus dem Quellcode und anscheinend

sudo make install 

habe diesen nicht gefangen. Ich kramte herum und fand

gcc/trunk/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.15

Ich habe es in / usr / lib kopiert und libstdc ++. So.6 umgeleitet, um auf das neue zu verweisen, und jetzt funktioniert alles.

Chris
quelle
1
Ich habe das gleiche Problem und dieser Beitrag / diese Antwort ist genau das, wonach ich suche. Vielen Dank!
Yoco
1
Dies funktioniert auch mit gcc 4.6.2, außer es ist libstdc ++. So.6.0.16. Vielen Dank!
Venesectrix
2
Meins ist gcc 4.7 und libstdc ++. So.6.0.17. Hatte das gleiche Problem mit dieser Lösung behoben. Ein großes Lob.
Ricbit
1
Ja da ist. Eine apt-getbasierte Lösung für dieses Problem ist hier beschrieben: superuser.com/questions/310809/...
aroth
4
@roosevelt: Es ist kein Problem mit dem Betriebssystem, es ist ein Problem mit Benutzern, die Software selbst installieren und dann den Linker nicht richtig verwenden. Es ist eine FAQ: gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
54

Ich habe dieses Problem in der Vergangenheit vermieden, indem ich libstdc ++ einfach statisch mit diesem Parameter verknüpft habe, der beim Verknüpfen meiner ausführbaren Datei an g ++ gesendet wurde:

-static-libstdc++

Wenn das statische Verknüpfen in der Bibliothek eine Option ist, ist dies wahrscheinlich die schnellste Lösung.

Martin G.
quelle
2
Vielen Dank, ich habe jede andere auf SO vorgeschlagene Lösung ausprobiert und nichts hat funktioniert als diese.
Itamar Katz
1
Vielen Dank für Ihre Lösung, es hilft mir sehr!
Brightshine
Das Problem ist, dass die Bibliothek nicht gefunden werden kann und nicht, dass Sie statisch verknüpfen sollten. Siehe die Antwort von @Hobo.
Dan Mergens
45

Ich habe versucht, Clang zum Laufen zu bringen (was auch 6.0.15 erfordert), und beim Stöbern habe ich festgestellt, dass es bei installiert wurde /usr/local/lib/libstdc++.so.6.0.15. Es wurde dort installiert, als ich Graphit installiert habe (eine experimentelle gcc-Version).

Wenn Sie an diesem Speicherort Zugriff auf Bibliotheken benötigen, müssen Sie Folgendes definieren LD_LIBRARY_PATH:

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

Danach konnte ich mich an die Arbeit machen. Hoffe das ist jemandem hilfreich.

Hobo
quelle
Ich habe an einem eingebetteten Ziel gearbeitet und habe das gleiche Problem. Ihre Lösung scheint in meinem Fall nicht zu funktionieren. Tatsächlich verwendet der größte Teil der Binärdatei im Ziel die Standard-c-Bibliothek in / lib, sodass sich Änderungen LD_LIBRARY_PATHauf sie auswirken. Sie werden alle auf die neue Bibliothek verlinken. Am Ende funktionieren die meisten Binärdateien nicht: wie zum Beispiel ls grep: Ich bekomme:ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Mouin
14

Ich stoße auf dieses Problem, wenn ich versuche, mit matlab eng m Funktionen aus c-Code aufzurufen. was mit Befehl auftrittmex -f .. ..

Meine Lösung:

strings /usr/lib/i386-<tab>/libstdc++.so.6 | grep GLIBC

Ich fand es enthält 3.4.15

Mein System hat also die neuesten Bibliotheken.

das problem kommt von matlab selbst, es ruft sein eigenes libstdc ++ auf. so.6 von {MATLAB}/bin

Ersetzen Sie es einfach durch die aktualisierte Systembibliothek.

Cheng Chang
quelle
Dies scheint auch für mich in Matlab 2013b x64 auf Xubuntu 13.04 x64
Marcin
Vielen Dank. Ich musste nur einen neuen symbolischen Link für die Datei in {MATLAB}/bindie Datei in erstellen /usr/lib/und dann matlab neu starten . Dies funktioniert in Matlab 2010b unter Fedora 14 x64.
Wok
2

Ich habe den gleichen Fehler bekommen. So hat es bei mir funktioniert:

  • bereinigte das Projekt unter aktuell installiertem gcc
  • neu kompiliert

Hat perfekt funktioniert!

iueae
quelle
2

Für diesen Fehler habe ich die neueste Version von libstdc ++. So.6.0.17 von einem anderen Server kopiert, den Softlink entfernt und neu erstellt.

1. Kopieren Sie die Datei libstdc ++. So.6.0.15 oder die neueste Version von einem anderen Server auf das betroffene System.
In meinem Fall hatte SUSE Linux 11 SP3 die neuesten.
2. rm libstdc ++. So.6
3. ln -s libstdc ++. So.6.0.17 libstdc ++. So.6 (im Verzeichnis / usr / lib64).

nJoy

crazyLinux
quelle
2

Ich habe gerade mit einem ähnlichen Problem beim Erstellen der LLVM 3.7-Version konfrontiert. Überprüfen Sie zunächst, ob Sie die erforderliche Bibliothek auf Ihrem System installiert haben:

$locate libstdc++.so.6.*

Fügen Sie dann den gefundenen Speicherort Ihrer Umgebungsvariablen $ LD_LIBRARY_PATH hinzu.

Arsen
quelle
2
Dies funktioniert nur, wenn Sie eine libstdc ++. So.6. * Lib mit GLIBCXX_3.4.15-Unterstützung haben
warunapww
2

Manchmal steuern Sie den Zielcomputer nicht (z. B. muss Ihre Bibliothek auf einem gesperrten Unternehmenssystem ausgeführt werden). In diesem Fall müssen Sie Ihren Code mit der Version von GCC neu kompilieren, die der GLIBCXX-Version entspricht. In diesem Fall können Sie Folgendes tun:

  1. Suchen Sie nach der neuesten Version von GLIBCXX, die vom Zielcomputer unterstützt wird: strings /usr/lib/libstdc++.so.6 | grep GLIBC... Angenommen, die Version ist 3.4.19.
  2. Verwenden Sie https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html , um die entsprechende GCC-Version zu finden. In unserem Fall ist dies [4.8.3, 4.9.0).
Gili
quelle
1

gcc version 4.8.1, der fehler scheint wie folgt:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen: /usr/lib64/libstdc++.so.6: Version `GLIBCXX_3.4.15 'nicht gefunden (erforderlich von / root / bllvm / build / Release + Asserts / bin / llvm-tblgen)

Ich habe die libstdc ++. So.6.0.18 an der Stelle gefunden, an der ich gcc 4.8.1 eingehalten habe

Dann gefällt mir das

cp ~/objdir/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18 /usr/lib64/

rm /usr/lib64/libstdc++.so.6

ln -s libstdc++.so.6.0.18 libstdc++.so.6

Problem gelöst.

Favoorr
quelle
1

Ich habe sie aus einem RPM ( RPM für libstdc ++ ) extrahiert und dann:

export LD_LIBRARY_PATH=.

So stellen Sie das System so ein, dass nach den Bibliotheken im aktuellen Verzeichnis gesucht wird. Dann habe ich gerade mein Programm ausgeführt. Aber in meinem Fall habe ich eine einzige ausführbare Datei erhalten, die ich brauchte, es war keine systemweite Änderung.

prmottajr
quelle
0

Ich hatte ein ähnliches Problem und habe es behoben, indem ich statisch libstdc++auf das Programm verlinkt habe, das ich kompiliert habe:

$ LIBS=-lstdc++ ./configure ... etc.

statt des üblichen

$ ./configure ... etc.

Es kann Probleme mit dieser Lösung geben, die mit dem Laden gemeinsam genutzter Bibliotheken zur Laufzeit zusammenhängen, aber ich habe mich nicht gründlich genug mit dem Problem befasst, um es zu kommentieren.

Evgeni Sergeev
quelle
0

Ich hatte das gleiche Problem, weil ich den Benutzer von mir zu jemand anderem geändert habe:

su

Aus irgendeinem Grund konnte ich es nach dem normalen Kompilieren nicht ausführen (dieselbe Fehlermeldung). Direkt ssh zum anderen Benutzerkonto funktioniert.

Hallo Welt
quelle
Dies beantwortet die Frage nicht wirklich. Wenn Sie eine andere Frage haben, können Sie diese stellen, indem Sie auf Frage stellen klicken . Sie können auch ein Kopfgeld hinzufügen, um mehr Aufmerksamkeit auf diese Frage zu lenken.
Ravron
Nein, weil ich genau das gleiche Problem hatte. Es wurde durch einen Benutzerwechsel verursacht. Es hätte auch jemand anderem passieren können, zum Beispiel zu root wechseln.
HelloWorld
Mein Fehler! Ich wurde von der ersten Zeile geworfen, die aussah, als hättest du auch das Problem. Mach weiter!
Ravron
Ich habe auch Ubuntu verwendet und auch versucht, Programme zu kompilieren und habe auch die gleiche Fehlermeldung wie in der Frage erhalten. Mein Fehler war, dass ich es mit dem Befehl su in einem anderen Benutzerkonto gemacht habe. Ich denke, dies beantwortet die Frage, weil es sich mit dem Warum und Wie des Problems befasst. Es ist sicherlich eine Möglichkeit.
HelloWorld
Und ein Benutzer hatte LD_LIBRARY_PATH eingestellt, um die neuere Bibliothek zu finden, aber nicht den anderen Benutzer? Das scheint im spezifischen Kontext dieser Frage etwas weit hergeholt zu sein.
Marc Glisse
0

Ich hatte mehrere Versionen des gcc-Compilers installiert und musste eine neuere Version als die Standardinstallation verwenden. Da ich kein Systemadministrator für unsere Linux-Systeme bin, kann ich nicht einfach / usr / lib oder viele der oben genannten Vorschläge ändern. Ich bin auf dieses Problem gestoßen und habe es schließlich aufgespürt, um meinen Pfad zum 32-Bit-Bibliotheksverzeichnis anstelle des 64-Bit-Bibliotheksverzeichnisses (lib64) festzulegen. Da die Bibliotheken im 32-Bit-Verzeichnis nicht kompatibel waren, verwendete das System standardmäßig die ältere Version, die veraltet war.

Die Verwendung von -L für den Pfad, auf den ich verwies, gab Warnungen zum "Überspringen inkompatibler libstdc ++. Also bei der Suche nach -lstdc ++". Dies war der Hinweis, der mir half, das Problem endlich zu lösen.

Cathy
quelle
0

Gleiches gilt für die gcc-Version 4.8.1 (GCC)und libstdc++.so.6.0.18. Musste es hier /usr/lib/x86_64-linux-gnuauf meine Ubuntu-Box kopieren .

ervinbosenbacher
quelle
0

In meinem Fall hatte LD_LIBRARY_PATH zuerst / usr / lib64 vor / usr / local / lib64. (Ich habe llvm 3.9 gebaut).
Der neue gcc-Compiler, den ich zum Kompilieren von llvm 3.9 installiert habe, hatte Bibliotheken mit neueren GLIBCXX-Bibliotheken unter / usr / local / lib64. Daher habe ich LD_LIBRARY_PATH korrigiert, damit der Linker zuerst / usr / local / lib64 sieht.
Das hat dieses Problem gelöst.

Chan Kim
quelle
0

Ich habe gerade -static-libstdc ++ beim Erstellen verwendet. w / damit kann ich das a.out ausführen

g++ test.cpp -static-libstdc++
Suresh
quelle
0

Zu Testzwecken:

Suchen Sie auf dem Originalcomputer die Bibliothek und kopieren Sie sie in dasselbe Verzeichnis wie die ausführbare Datei:

$ ldconfig -p | grep libstdc
        libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (libc6) => /usr/lib32/libstdc++.so.6
$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 .

Kopieren Sie dann dieselbe Bibliothek auf den Zielcomputer und führen Sie die ausführbare Datei aus:

LD_LIBRARY_PATH=. ./myexecutable

Hinweis: Der obige Befehl ist vorübergehend. Es ist keine systemweite Änderung.

Contango
quelle