_GLIBCXX_USE_CXX11_ABI, GCC 4.8 und ABI-Kompatibilität

8

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.

  1. Gibt es eine Möglichkeit, dies mit GCC 4.8 zu machen oder müssen wir die Leute bitten, die Bibliotheken mit einem anderen _GLIBCXX_USE_CXX11_ABI ?
  2. neu zu kompilieren?
  3. Ich denke, wenn wir zu GCC & gt; = 5.1 wechseln können, können wir das schaffen?

Danke!

    
Tanasis 31.07.2017, 13:47
quelle

1 Antwort

4

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:

%Vor%

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.

    
ecatmur 31.07.2017, 16:08
quelle

Tags und Links