Le défi: lier une bibliothèque partagée
J'ai récemment rencontré un problème de liaison tout en intégrant une bibliothèque construite par source dans un projet local C. Le linker a signalé des erreurs undefined reference
lors de la tentative de liaison avec la bibliothèque partagée. Les messages d'erreur, similaires à ceux ci-dessous, ont indiqué que le linker ne pouvait pas trouver de symboles définis dans la bibliothèque:
<code>/bin/ld: /tmp/ccHb7mJ8.o: in function `SDL_main': main.c:(.text+0x3c): undefined reference to `SDL_EnterAppMainCallbacks' ... (other undefined references) ... collect2: error: ld returned 1 exit status make: *** [Makefile:7: all] Error 1</code>
Étapes de dépannage
Le dépannage initial impliquait de recompiler la bibliothèque plusieurs fois en utilisant diverses méthodes, le tout sans succès. La recherche m'a conduit à un post de forum décrivant un problème similaire lié aux chaînes d'outils 32 bits et 64 bits. Bien que mon environnement ait été confirmé comme 64 bits, cela m'a incité à considérer le compilateur lui-même.
La solution inattendue: commutation des compilateurs
Je suis passé de GCC à Clang, et la compilation et la liaison ont fonctionné parfaitement. Cela était surprenant, étant donné la simplicité apparente de la solution et le manque de problèmes similaires dans les projets antérieurs.
Une expérience contrôlée
Pour approfondir, j'ai créé un cas de test simple: une bibliothèque partagée (libm.so
) implémentant une fonction add
, compilée avec Clang, et un programme de pilote (main.c
) Tenter de l'utiliser.
lib.h:
<code class="language-c">#pragma once int add(int a, int b);</code>
lib.c:
<code class="language-c">#include "lib.h" int add(int a, int b) { return a + b; }</code>
main.c:
<code class="language-c">#include "lib.h" #include <stdio.h> int main () { printf("4+3=%d\n", add(4, 3)); return 0; }</code>
build_so.sh (clang):
<code class="language-bash">clang -std=c11 -c -o lib.o lib.c clang -shared -fPIC -o libm.so lib.o</code>
build_main.sh (gcc):
<code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
Cela a entraîné les mêmes erreurs undefined reference
que mon projet d'origine. Cependant, lorsque le script build_main.sh
a été modifié pour utiliser Clang, le problème a été résolu. Une autre expérience a inversé les rôles du compilateur (GCC pour la bibliothèque, Clang pour le programme principal), et cette combinaison a fonctionné correctement.
Conclusion: Incompatibilité du compilateur
L'enquête a révélé une incompatibilité apparente: les bibliothèques partagées compilées par Clang semblent avoir des problèmes lorsqu'ils sont liés au CCG, tandis que le scénario inverse fonctionne sans problème. Cela explique probablement pourquoi je n'avais pas rencontré ce problème auparavant, car j'utilise généralement le même compilateur pour toutes les parties d'un projet. La cause profonde de cette incompatibilité reste claire, mais elle met en évidence un écueil potentiel lors de l'intégration de bibliothèques construites avec différents compilateurs. Si quelqu'un connaît une solution de contournement, je serais très intéressé à l'entendre.
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!