web-dev-qa-db-fra.com

Conversion de std :: __ cxx11 :: string en std :: string

J'utilise c ++ 11, mais aussi certaines bibliothèques qui ne sont pas configurées pour cela et qui nécessitent une conversion de type. En particulier, j'ai besoin d'un moyen de convertir std::__cxx11::string en std::string normal, mais googler je ne peux pas trouver un moyen de faire cela et mettre (string) devant ne fonctionne pas.

Si je ne convertis pas, j'obtiens les erreurs de l'éditeur de liens comme ceci:

undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const'
62
jorgen

Est-il possible que vous utilisiez GCC 5?

Si vous obtenez des erreurs de l'éditeur de liens concernant des références non définies à des symboles impliquant des types dans l'espace de noms std :: __ cxx11 ou la balise [abi: cxx11], cela signifie probablement que vous essayez de lier des fichiers objet compilés avec des valeurs différentes pour _GLIBCXX_USE_CXX11_ABI. macro. Cela se produit généralement lorsque vous vous connectez à une bibliothèque tierce compilée avec une version plus ancienne de GCC. Si la bibliothèque tierce ne peut pas être reconstruite avec le nouvel ABI, vous devrez recompiler votre code avec l'ancien ABI.

Source: Notes de version GCC 5/Dual ABI

La définition de la macro suivante before, y compris les en-têtes de bibliothèque standard, devrait résoudre votre problème: #define _GLIBCXX_USE_CXX11_ABI 0

81
Matthäus Brandl

Si vous pouvez recompiler toutes les bibliothèques incompatibles que vous utilisez, faites-le avec l'option compiler. 

-D_GLIBCXX_USE_CXX11_ABI = 1

puis reconstruisez votre projet. Si vous ne pouvez pas le faire, ajoutez à l'option du compilateur Makefile de votre projet

-D_GLIBCXX_USE_CXX11_ABI = 0

La définir

#define _GLIBCXX_USE_CXX11_ABI 0/1

c'est aussi bien, mais vous aurez probablement besoin de l'ajouter à tous vos fichiers pendant que l'option compilateur le fera pour tous les fichiers à la fois.

44
Denis Sirotkin

Les réponses ici se concentrent principalement sur le moyen court de le réparer, mais si cela ne vous aide pas, je vais vous donner quelques étapes à vérifier, cela m'a aidé (Linux uniquement):

  • Si les erreurs de l'éditeur de liens se produisent lors de la liaison d'autres bibliothèques, générez ces bibliothèques avec les symboles de débogage (indicateur "-g" GCC)
  • Répertoriez les symboles de la bibliothèque et grep les symboles pour lesquels l'éditeur de liens se plaint (entrez les commandes en ligne de commande):

    nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout

  • Si vous avez la signature de la méthode, passez à l'étape suivante, si vous avez plutôt no symbols, vous aurez probablement enlevé tous les symboles de la bibliothèque et c'est pourquoi l'éditeur de liens ne peut pas les trouver lors de la liaison de la bibliothèque. Reconstruisez la bibliothèque sans supprimer TOUS les symboles, vous pouvez supprimer les symboles de débogage (strip -S) si vous en avez besoin.

  • Utilisez un démangleur c ++ pour comprendre la signature de la méthode, par exemple, celui-ci

  • Comparez la signature de méthode dans la bibliothèque que vous venez de recevoir avec celle que vous utilisez dans le code (vérifiez également le fichier d'en-tête). Si elles sont différentes, utilisez l'en-tête approprié, la bibliothèque appropriée ou tout autre moyen que vous connaissez pour le corriger.
1
rightaway717

Pour moi, -D_GLIBCXX_USE_CXX11_ABI = 0 n'a pas aidé.

Cela fonctionne après que j'ai lié à la version de libs C++ au lieu de gnustl.

0
dimon4eg

Quand j'ai eu un problème similaire, c'est parce que ma bibliothèque a été construite en utilisant clang++, et qu'elle est liée à libstdc++.so par défaut sur mon système. Alors que le binaire de l'application a été construit à l'aide de clang et lié à l'option -lc++.

Le moyen le plus simple de vérifier les dépendances consiste à exécuter ldd libName.so

Pour résoudre ce problème, vous devez utiliser la même bibliothèque dans l'application et la bibliothèque.

  • Manière la plus simple. Construisez la bibliothèque en utilisant clang++ et compilez l'application en utilisant clang++. Sans options de liaison supplémentaires sur les deux étapes. Stdlib par défaut sera utilisé.

  • Construisez la bibliothèque avec -stdlib=c++ et compilez l'application avec -lc++. Dans ce cas, la bibliothèque et l'application utiliseront libc++.so.

  • Construire une bibliothèque sans options supplémentaires et lier le binaire à -lstdc++. Dans ce cas, la bibliothèque et l'application utiliseront libstdc++.so.

0
Evgen Bodunov

Je l’ai eu, la seule façon de résoudre ce problème était de mettre à jour tout mingw-64 (je l’ai fait avec pacman sur msys2 pour votre information).

0
ceorron