31 Stimmen

Link mit einer älteren Version von libstdc++

Nachdem ich eine neue Build-Maschine installiert hatte, stellte ich fest, dass sie mit 6.0.10 der Standard-C++-Bibliothek kam

-rw-r--r--  1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10

Viele unserer Zielmaschinen verwenden jedoch immer noch eine ältere Version von libstdc++, zum Beispiel:

-rwxr-xr-x 1 root root  985888 Aug 19 21:14 libstdc++.so.6.0.8

Offensichtlich hat sich die ABI in diesen letzten beiden 0.0.1's geändert, da der Versuch, ein Programm auszuführen, zu folgendem Ergebnis führt

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

Ich habe versucht, explizit eine ältere Version von gcc zu installieren, aber das hat nicht geholfen. Das Aufrüsten der Zielmaschinen liegt nicht in meiner Kontrolle, also keine Option. Wie kann ich sicherstellen, dass meine Builds auf Maschinen mit einer älteren libstdc++ funktionieren?

Ich habe im apt-cache nach älteren libstdc++-Versionen gesucht, die installiert werden können, aber anscheinend sind keine älteren Versionen von 6 verfügbar?

21voto

Jan Punkte 1777

Sie müssen nicht auf eine andere Bibliothek verlinken, sondern eine ältere Version des Compilers verwenden.

Werfen Sie einen Blick auf die GNU ABI-Richtlinie. Die gemeinsam genutzte libstdc++-Bibliothek ist so konzipiert, dass sie vorwärtskompatibel ist. Das heißt, Version 6.0.10 kann verwendet werden, wenn Sie 6.0.8 benötigen. In der Richtlinie können Sie lesen, dass ab gcc-4.2.0 6.0.9 benötigt wird, daher benötigen Sie ein gcc-4.1.x.

Kurz gesagt, deshalb gibt es nur eine libstdc++.so.6.0.x auf Ihrem System, Sie benötigen nur die neueste.

Was die Einrichtung Ihres Build-Systems betrifft, um nur eine bestimmte Version des Compilers zu verwenden: Stellen Sie sicher, dass das Standard g++ nicht verwendet werden kann (umbenennen des Links, Entfernen des Pakets, das es bereitstellt, aus dem PATH entfernen) und fangen Sie an zu graben. Hat bei mir funktioniert.

7voto

paxdiablo Punkte 809679

Sie können die erforderlichen gemeinsam genutzten Bibliotheken mit Ihrem eigenen Code (zum Beispiel in einem Unterverzeichnis) versenden und LD_LIBRARY_PATH festlegen, um vor dem Ausführen Ihrer Anwendung zuerst in diesem Verzeichnis zu suchen.

Das Versenden der spezifischen Version, die Sie benötigen, bedeutet, dass es keine Rolle spielt, welche Version der Benutzer installiert hat. Sie müssen nur sicherstellen, dass Sie auch alle Abhängigkeiten versenden.

3voto

Pieter Punkte 16973

Ein alternativer Ansatz, der für mich nicht funktioniert hat, aber vielleicht für jemand anderen nützlich ist, besteht darin, libgcc und libstdc++ statisch zu verknüpfen.

gcc hat eine Option -static-libgcc, aber allein die Verwendung dieser Option erreicht nichts, da libstdc++ immer noch dynamisch verknüpft ist. Aber indem sichergestellt wird, dass gcc nur die statische Version von libstdc++ finden kann, kann eine statische Verknüpfung erreicht werden.

ln -s `g++ -print-file-name=libstdc++.a`
g++ -static-libgcc -L. source.cpp

Das Problem ist, dass die Boost-Bibliotheken gegen das neuere libstdc++ erstellt wurden. Daher, obwohl das Programm korrekt kompiliert, treten Laufzeitfehler auf...

Vielleicht ist dies lösbar, wenn ich auch Boost neu erstelle, habe das noch nicht ausprobiert.

(zur Erinnerung, wenn Sie Code verwenden, der Bibliotheken dynamisch lädt, z.B. über dlopen, ist das statische Verknüpfen überhaupt keine Option)

2voto

Didier Trosset Punkte 34648

Schon damit konfrontiert. Ich habe nicht an etwas Besseres gedacht, als ein System (virtualisiert?) mit derselben Konfiguration wie die Zielmaschinen zu installieren, um die verteilbaren Binärdateien zu erstellen.

1voto

just somebody Punkte 17584

Sie können entweder die neuere libstdc++ in Clientsysteme "schmuggeln" (in einen privaten Bereich) und die Programme mit dem entsprechenden -rpath verlinken, oder Sie können eine ältere Version von libstdc++ auf Ihrem Computer bekommen. Es scheint, als ob Sie das Update nicht brauchen und es aus anderen Gründen sowieso fraglich sein könnte.

Hinweis: Auf FreeBSD ist libstdc++ mit dem Compiler verbunden (ich habe gcc4.2, 4.4 und 4.5 installiert, jeweils mit seiner eigenen libstc++). Versuchen Sie, eine ältere (die zu den Clientsystemen passt) Version von gcc zu installieren, möglicherweise enthält sie die ältere libstdc++, nach der Sie suchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X