Pourquoi clang avec la libc en mode C 0x ne parvient pas à lier Boost::Program_Options Exemple
L'extrait donné démontre un problème lors de la tentative de compilation et link boost::program_options avec clang utilisant la libc en mode C 0x.
Analyse du problème
L'erreur de compilation provient de l'incompatibilité entre libc et libstdc , la norme par défaut bibliothèque implémentée par g . libc utilise différents détails d'implémentation pour std::string, introduisant une différence ABI (Application Binary Interface) par rapport à libstdc .
Solution
Pour résoudre ce problème, il est nécessaire pour reconstruire Boost en utilisant clang avec l'indicateur -stdlib=libc. Cela garantit que les bibliothèques Boost sont compilées avec la même bibliothèque standard à laquelle l'exécutable est lié. Il harmonise l'ABI de std::string dans les bibliothèques Boost et le programme en cours de compilation.
Explication technique
libc exploite les espaces de noms en ligne pour modifier l'ABI de std : :string sans modifier son API. Cela crée une divergence perçue entre les deux bibliothèques, où std::string de libstdc et std::__1::string de libc sont traités comme des structures de données distinctes par l'éditeur de liens.
En reconstruisant Boost avec le standard approprié bibliothèque, les définitions de symboles pour boost::program_options correspondent à celles attendues par l'éditeur de liens, permettant une liaison réussie.
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!