Ich habe eine Konfigurationsprüfung, die bestimmt, welche Flags basierend auf Plattform und Version an g ++ übergeben werden. Ich verwende normalerweise eine spätere Version von gcc als die native Installationsversion, um Zugriff auf C++ 14-Funktionen zu erhalten. Auf älteren Plattformen bedeutet dies, dass ich -D_GLIBCXX_USE_CXX11_ABI = 0 hinzufügen muss, um die ältere C++ - ABI zu verwenden, oder ich kann keine Verknüpfung mit Host-Versionen von C++ - Bibliotheken herstellen. Allerdings verwenden einige neuere Plattformen die neue ABI. In diesem Fall ist -D_GLIBCXX_USE_CXX11_ABI = 1 (oder gar nichts) erforderlich.Wie der C++ - ABI, der von der Systemversion von gcc auf der Zielplattform verwendet wird, getestet wird
Ich kann dies basierend auf der Version der Zielplattform (d. H. Die Ausgabe von lsb_release -a) tun, aber ich möchte eine allgemeinere Methode.
Ich denke, ich bin auf halbem Weg mit der Kompilierung eines C++ Hallo Welt-Programm mit dem nativen Compiler (im Gegensatz zu meinem späteren), aber ich kann nicht ganz herausfinden, wie die ABI-Version zu testen. Zum Beispiel
oder ähnlich auf die Version von libstdC++, die von dem Hello-Probe-Programm verwandt wird.
ldd ./hello | grep stdc++ | sed -e 's_.* /_/_' | cut -f 1 -d' ' |xargs strings | grep
Hat jemand bessere Vorschläge?
update: In der Tat muss ich das überhaupt nicht tun. Mein echtes Problem war, dass ich eine ältere Version von libstdC++ hatte. Die Kompilation hat eine Version 6.0.20 gefunden und die Laufzeit hat eine inkompatible Version 6.0.19 (oder möglicherweise umgekehrt) gefunden. Ich hatte ein ungelöstes Symbol, das ich fälschlicherweise der ABI-Version vorwarf. Entgegen der landläufigen Meinung sind Nebenversionen von libstdC++ nicht immer binärkompatibel. Ich beabsichtige immer die exakt gleiche Version zur Laufzeit und zur Kompilierzeit zu verwenden (wenn nicht die native Host-Version verwendet wird).
Ich habe die Frage nicht beantwortet, aber mein Problem gelöst, ist die Antwort nicht mehr wichtig für mich. Diese Frage kann geschlossen werden. –
libstdC++ ist vorwärtskompatibel, ich bin nicht einmal sicher, ob sie irgendeiner Form der semantischen Versionierung folgen. Ich wette, wenn Sie mit 6.0.19 verbunden und den resultierenden Code mit 6.0.20 ausgeführt haben, würde es gut funktionieren. – rubenvb
Während es beabsichtigt ist, wahr zu sein. Sie können immer noch Probleme haben. Ich habe einige (interne) Programme unter Verwendung einer späteren Version der Bibliothek, die auf subtile Weise fehlerkompatibel waren, gebrochen. Ich würde nicht riskieren wollen, ein Systemprogramm so zu brechen, als wäre es sehr schwer zu debuggen. Siehe auch http://stackoverflow.com/questions/25979778/forcing-or-preventing-use-of-a-particular-mino-version-of-libstdc –