web-dev-qa-db-de.com

GLIBCXX-Versionen

Wenn ich ein C++ - Programm auf meinem Computer kompiliere und auf einem anderen (mit älterer Software) laufe, erhalte ich: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found.

Auf meinem System ist glibc tatsächlich neuer (ich habe gcc-libs 4.5.1: libstdc ++. So.6.0.14) und strings /usr/lib/libstdc++.so.6 | grep GLIBCXX druckt von GLIBCXX_3.4 nach GLIBCXX_3.4.14. Auf dem anderen System wird stattdessen nur bis zu GLIBCXX_3.4.8 gedruckt (ich habe libstdc ++. So.6.0.8).

Ich habe also ein paar Fragen:

  1. Warum verknüpft mein Linker C++ - Binärdateien mit der libstdc ++ - Version GLIBCXX_3.4.9 anstelle von GLIBCXX_3.4.14?

  2. Wenn ich meine Binärdatei mit der libstdc ++ - Version GLIBCXX_3.4 verglich, würde sie fast überall laufen. Wäre das irgendwelche Probleme? (zB: Würden ältere Algorithmen und damit schlechtere Algorithmus-Implementierungen verwendet?)

  3. Wenn ich stattdessen statisch mein Programm mit meiner libstdc ++ verlinke, würde es wohl überall laufen; das binäre wird viel größer sein (~ 1MB) natürlich alle anderen vor- und Nachteile?

  4. Kann ich den Linker dazu zwingen, meine Binärdatei mit einer bestimmten Version von libstdc ++ zu verknüpfen?

35
peoro

Verwenden Sie readelf -a und objdump -x, um ELF-Dateien vorrangig zu strings zu prüfen.

Tatsächlich gelten alle Versionen von GLIBCXX_ * nicht für die gesamte Bibliothek, sondern für jedes Symbol (Symbolversionierung siehe DSO-howto ). So können Sie beispielsweise: std::char_traits<wchar_t>::[email protected]@GLIBCXX_3.4.5 und std::ios_base::Init::~Init()@@GLIBCXX_3.4 in derselben Bibliotheksdatei haben.

Die Tatsache, dass Ihr Programm GLIBCXX_3.4.9 benötigt, bedeutet wahrscheinlich, dass es mit einem Symbol verknüpft wurde, das auf GLIBCXX_3.4.9 die Semantik eingeführt/geändert hat.

34
ninjalj
  1. Dies ist die Bibliotheksversion, die auf Ihrem System installiert ist. Sie könnten Die glibc-Version 3.4.14 manuell erstellen und darauf verlinken
  2. Kommt darauf an. Vielleicht hat die spätere Version einige Probleme behoben. Die Benutzer Ihres Programms müssten sich mit der Version verbinden, die Ihr Programm benötigt
  3. Die Speichernutzung ist höher
  4. Ja, übergeben Sie die richtigen Parameter an den Linker. Wenn Sie eine bestimmte Version der Bibliothek benötigen, laden Sie sie am besten herunter und erstellen Sie sie manuell.

EDIT

Ich erinnerte mich gerade daran, dass statisch verknüpfte Bibliotheken die Speichernutzung erhöhen.

0
BЈовић