Au moins pour la bibliothèque Crypto++, cela ne fonctionne pas (vérifié :-( ). Donc, pour le code c++, il est moins probable que cela fonctionne, alors que le code c pur lierait probablement OK.
EDIT :Le problème a commencé à apparaître avec Mac OS X 10.9 Mavericks et Xcode-5, qui ont changé la bibliothèque C++ par défaut pour clang de libstdc++ à libc++. Il n'existait pas sur Mac OS X 10.8 et versions antérieures.
La solution semble être la suivante :si vous devez compiler du code C++ avec clang et le lier à une bibliothèque compilée par gcc, utilisez "clang++ -stdlib=libstdc++". La liaison est réussie et le binaire résultant s'exécute correctement.
CAVEAT :Cela ne semble pas fonctionner dans l'autre sens :même si vous pouvez créer une bibliothèque compilée avec "clang++ -stdlib=libstdc++" et y lier du code compilé par gcc, ce code plantera avec SEGV. Jusqu'à présent, j'ai trouvé que le seul moyen de créer un lien avec une bibliothèque compilée par clang est de compiler votre code avec clang, pas avec gcc.
EDIT2 :GCC-12 semble inclure -stdlib=
drapeau. Compiler avec g++ -stdlib=libc++
crée Clang++
-fichiers objets compatibles. Très bien.
Oui, vous habituellement peut utiliser clang
avec les bibliothèques compilées GCC (et vice versa, utilisez gcc
avec les bibliothèques compilées CLANG), car en fait ce n'est pas la compilation mais la liaison qui est pertinente. Vous pourriez être malchanceux et avoir de mauvaises surprises.
Vous pourriez en principe avoir des dépendances sur la version de libstdc++
utilisé pour lier les bibliothèques pertinentes (si elles sont codées en C++). En fait, cela n'a généralement pas beaucoup d'importance.
En C++, la manipulation des noms peut en théorie être un problème (il peut y avoir des cas particuliers, voire des incompatibilités entre deux versions différentes de g++
). Encore une fois, dans la pratique, ce n'est généralement pas un problème.
Vous pouvez donc généralement mélanger CLANG (même des versions différentes mais proches) avec GCC, mais vous risquez d'avoir de mauvaises surprises. Ce qu'on devrait attendre de n'importe quel compilateur C++ (que ce soit CLANG ou GCC) est simplement d'être capable de compiler et de lier un logiciel entier (et toutes les bibliothèques) ensemble en utilisant le même compilateur et la même version (et qui inclut la même implémentation de bibliothèque standard C++ ). C'est pourquoi la mise à jour d'un compilateur dans une distribution demande beaucoup de travail :les créateurs de la distribution doivent s'assurer que tous les paquets se compilent bien (et ils ont des surprises !).
Attention, la version de libstdc++ est importante. Les communautés Clang et GCC travaillent dur pour rendre son ABI compatible pour les mises à niveau du compilateur, mais il existe des cas subtils. Lisez la documentation de votre implémentation de bibliothèque standard C++ particulière et spécifique. Ces cas extrêmes pourraient expliquer des plantages mystérieux lors de l'utilisation d'un bon binaire de bibliothèque C++ (compilé avec GCC 5) dans votre code compilé avec GCC 8. Le bogue n'est pas dans la bibliothèque, mais l'ABI a évolué de manière incompatible.