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:
Warum verknüpft mein Linker C++ - Binärdateien mit der libstdc ++ - Version GLIBCXX_3.4.9
anstelle von GLIBCXX_3.4.14
?
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?)
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?
Kann ich den Linker dazu zwingen, meine Binärdatei mit einer bestimmten Version von libstdc ++ zu verknüpfen?
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.
EDIT
Ich erinnerte mich gerade daran, dass statisch verknüpfte Bibliotheken die Speichernutzung erhöhen.