web-dev-qa-db-fra.com

_GLIBCXX_USE_CXX11_ABI, compatibilité GCC 4.8 et ABI

Nous avons reçu quelques bibliothèques (.a) compilées pour linux (probablement compilées avec GCC 6.x).

Nous utilisons GCC 4.8 et nous obtenons l'erreur du type: undefined reference to std::__cxx11::basic_string lorsque vous essayez de créer un lien.

Normalement, cela pourrait être corrigé en s'assurant que toutes les unités ont été compilées avec le même _GLIBCXX_USE_CXX11_ABI drapeau. Cependant, si j'ai bien compris, cela a été introduit par GCC 5.1 et suivants.

  1. Existe-t-il un moyen de faire fonctionner cela avec GCC 4.8 ou devons-nous demander aux gens de recompiler les bibliothèques avec un _GLIBCXX_USE_CXX11_ABI?
  2. Je suppose que si nous sommes en mesure de passer à GCC> = 5.1, nous pouvons faire fonctionner cela?

Merci!

14
Tanasis

Il est possible d'utiliser l'ABI C++ 11 avec gcc 4.8.2, mais c'est un hack dangereux; vous feriez bien mieux si possible de demander à vos fournisseurs de livrer des bibliothèques compilées avec C++ 03 ABI (-D_GLIBCXX_USE_CXX11_ABI=0) ou pour passer à GCC 5 ou supérieur.

Vous devez télécharger et installer gcc 5 pour pouvoir utiliser ses en-têtes et bibliothèques libstdc ++, puis diriger gcc 4.8 pour les utiliser de préférence aux siens. De plus, comme gcc 4.8 manque certains éléments intrinsèques requis par la libstdc ++ livrée avec gcc 5, vous devrez pirater leur utilisation.

Par exemple, pour compiler une application simple à fichier unique qui inclut <string>:

/usr/local/gcc-4.8.2/bin/g++ \
   -std=c++11 \
   -D_GLIBCXX_USE_CXX11_ABI=1 \
   -D'__is_trivially_copyable(...)=0' \
   -D'__is_trivially_constructible(...)=0' \
   -D'__is_trivially_assignable(...)=0' \
   -nostdinc++ \
   -isystem /usr/local/gcc-5.4.0/include/c++/5.4.0/ \
   -isystem /usr/local/gcc-5.4.0/include/c++/5.4.0/x86_64-unknown-linux-gnu \
   -L /usr/local/gcc-5.4.0/lib64
   a.cpp

C'est dangereux car gcc 5.4 libstdc ++ n'est pas conçu pour fonctionner avec gcc 4.8 et redéfinit les intrinsèques utilisés (__is_trivially_copyable etc.) pourrait modifier la disposition des structures ou entraîner une incompatibilité binaire entre vos programmes et les bibliothèques du fournisseur.

Pour exécuter l'exécutable résultant, vous devez également vous assurer que l'éditeur de liens dynamique trouve un libstdc ++ compatible, par exemple en ajoutant /usr/local/gcc-5.4.0/lib64 à /etc/ld.so.conf, ou en utilisant -Wl,-rpath /usr/local/gcc-5.4.0/lib64.

8
ecatmur