Maison > développement back-end > C++ > Problème de bibliothèque partagée unique

Problème de bibliothèque partagée unique

Patricia Arquette
Libérer: 2025-01-28 14:03:11
original
365 Les gens l'ont consulté

Unique Shared Library Problem

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>
Copier après la connexion

É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>
    Copier après la connexion
  • lib.c:

    <code class="language-c">#include "lib.h"
    int add(int a, int b) {
    return a + b;
    }</code>
    Copier après la connexion
  • 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>
    Copier après la connexion
  • 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>
    Copier après la connexion
  • build_main.sh (gcc):

    <code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
    Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal