Conversion de __cxx11::string en std::string : un guide pour la gestion des bibliothèques incompatibles
Rencontre d'une incompatibilité entre std::__cxx11 : Le type :string et le std::string régulier peuvent être un problème frustrant. Lorsque vous essayez d'interfacer avec des bibliothèques qui ne sont peut-être pas configurées pour C 11, il est nécessaire de procéder à une conversion entre ces types. Cependant, tenter simplement de convertir un std::__cxx11::string en std::string en utilisant (string) ne suffit pas.
Ce problème peut souvent se manifester par des erreurs de l'éditeur de liens, telles que :
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'
Comprendre l'Ursache :
Une cause possible de cette incompatibilité réside dans l'utilisation de GCC 5. GCC 5 a introduit deux ABI pour la bibliothèque standard C, où le code compilé avec un ABI ne peut pas être lié au code compilé avec l'autre. Si une bibliothèque tierce a été compilée avec un ABI plus ancien alors que votre code utilise le plus récent ABI, des problèmes de liaison peuvent survenir.
La solution :
Pour résoudre ce problème , définissez la macro _GLIBCXX_USE_CXX11_ABI sur 0 avant d'inclure les en-têtes de bibliothèque standard. Cela oblige GCC à utiliser l'ancien ABI, garantissant la compatibilité avec la bibliothèque tierce.
#define _GLIBCXX_USE_CXX11_ABI 0 #include <iostream> #include <string>
Avec cette macro définie, l'éditeur de liens devrait être capable de résoudre avec succès les symboles et la conversion depuis std::__cxx11. ::string vers std::string devrait se dérouler sans erreur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!