69 votes

Utilisation des bibliothèques compilées libstdc ++ avec clang ++ -stdlib = libc ++

Je travaille en C++ sous Mac OS X (10.8.2) et j'ai récemment est venu avec le besoin de l'aide de C++11 fonctions, qui sont disponibles par le biais de la clang++ compilateur à l'aide de la libc++ stdlib. Cependant, j'ai aussi besoin d'utiliser une ancienne bibliothèque compilé et lié à l'encontre de libstdc++ (venant de MacPorts).

En agissant de la sorte, j'ai eu les erreurs de liaison, depuis les en-têtes de l'héritage des bibliothèques à l'aide, par exemple, std::string, à être réglées à l'encontre de l' std::__1::basic_string (c'est à dire, la libc++ mise en œuvre de l' std::string) au lieu de l' std::basic_string mise en œuvre.

Est-il possible de mélanger les deux bibliothèques en développement (par exemple, en utilisant quelques préprocesseurs les drapeaux?)

93voto

Howard Hinnant Points 59526

Ce que vous voyez est l'utilisation de inline espaces de noms pour atteindre ABI gestion des versions.

Ce que cela signifie:

La libstdc++ std::string est une autre structure de données de la libc++ std::string. Le premier est une référence compté de la conception, tandis que le second ne l'est pas. Bien qu'ils soient API compatibles, ils ne sont pas ABI compatible. Cela signifie que si vous construisez un std::string avec libstdc++, puis passer à un autre code qui est lié à l'encontre de la libc++, le code de la réception pourrait penser qu'il a une libc++ std::string. I. e. le récepteur n'aurait pas la moindre idée qu'il faut incrémenter ou décrémenter le nombre de références.

Sans inline espaces de noms, le résultat serait une erreur d'exécution. Le mieux qu'on pouvait espérer, c'est un accident. Avec inline espaces de noms cette erreur se traduit par un temps de lien d'erreur.

Pour vous le programmeur de la libstdc++ std::string et la libc++ std::string ressembler à un même type. Mais à l'éditeur de liens, ils ressemblent complètement différents types (l'indice est l' std::__1 d'espace de noms). Et l'éditeur de liens de vue est correct. Ils sont complètement différents types.

Donc, oui, vous pouvez manipuler certains préprocesseur indicateurs pour obtenir des choses de lien. Mais alors, vous auriez un diable d'un temps à mettre au point la résultante de l'exécution de bugs.

La seule façon de faire ce que vous voulez est de faire l'interface entre ces dylibs pas impliquer std::types comme string. Par exemple, vous pourriez passer des tableaux de char à la place. Vous pouvez même transférer de la mémoire de la propriété de la bibliothèque libstdc++-lié code de la libc++liés code et vice-versa (ils seront à la fois de tomber à travers la même fonction malloc de la piscine).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X