GNU/Linux >> Tutoriels Linux >  >> Linux

Clang peut-il compiler du code avec des bibliothèques .a compilées par GCC ?

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.


Linux
  1. Assistance à la vie 32 bits :compilation croisée avec GCC

  2. Comment compiler un binaire 32 bits sur une machine Linux 64 bits avec gcc/cmake

  3. aux prises avec les IDE c++ sous Linux

  4. Comment obtenir une trace de pile pour C++ en utilisant gcc avec des informations de numéro de ligne ?

  5. C/C++ avec GCC :ajouter statiquement des fichiers de ressources à l'exécutable/à la bibliothèque

Comment puis-je profiler du code C++ exécuté sous Linux ?

Impossible de compiler l'exemple à partir des tampons de protocole Google

Mon chargeur de démarrage ne peut pas être compilé avec gcc 4.6 et 4.7 ... seulement 4.5

Pouvons-nous utiliser du code C en Python ?

Pourquoi clang a-t-il encore besoin de libgcc.a pour compiler mon code ?

Impossible d'appeler la fonction de bibliothèque standard C sur Linux 64 bits à partir du code d'assemblage (yasm)