Wir haben einige Bibliotheken (.a) für Linux kompiliert (wahrscheinlich mit GCC 6.x kompiliert).
Wir verwenden GCC 4.8 und erhalten den Fehler vom Typ:
undefined reference to std::__cxx11::basic_string
beim Versuch, eine Verknüpfung herzustellen.
Normalerweise könnte dies behoben werden, indem sichergestellt wird, dass alle Einheiten mit dem gleichen _GLIBCXX_USE_CXX11_ABI
Flag kompiliert wurden.
Wenn ich jedoch richtig verstanden habe, wurde dies von GCC 5.1 und weiter eingeführt.
_GLIBCXX_USE_CXX11_ABI
? Danke!
Es ist möglich, den C ++ 11 ABI mit gcc 4.8.2 zu verwenden, aber es ist ein gefährlicher Hack; Es wäre viel besser für Sie, wenn Sie Ihre Lieferanten bitten könnten, Bibliotheken, die mit C ++ 03 ABI ( -D_GLIBCXX_USE_CXX11_ABI=0
) kompiliert wurden, zu versenden oder auf GCC 5 oder höher zu aktualisieren.
Sie müssten gcc 5 herunterladen und installieren, so dass Sie seine Header und Bibliotheken libstdc ++ verwenden können, und dann gcc 4.8 anweisen, diese bevorzugt zu verwenden. Da gcc 4.8 einige intrinsische Eigenschaften, die libstdc ++ benötigt, die mit gcc 5 ausgeliefert werden, nicht benötigt, müssten Sie deren Verwendung hacken.
Zum Beispiel, um eine einfache Einzeldatei-Anwendung zu kompilieren, die <string>
enthält:
Dies ist gefährlich, weil gcc 5.4 libstdc ++ nicht für die Arbeit mit gcc 4.8 vorgesehen ist und die neu definierten intrinsics ( __is_trivially_copyable
usw.) das Layout von Strukturen ändern oder eine Inkompatibilität zwischen Ihren Programmen und den Bibliotheken des Anbieters verursachen könnten .
Um die resultierende ausführbare Datei auszuführen, müssen Sie außerdem sicherstellen, dass der dynamische Linker eine kompatible libstdc ++ findet, indem Sie beispielsweise /usr/local/gcc-5.4.0/lib64
zu /etc/ld.so.conf
hinzufügen oder -Wl,-rpath /usr/local/gcc-5.4.0/lib64
verwenden.