Forum Programmation.c Compilation et utilisation bibliothèque dynamique

Posté par  . Licence CC By‑SA.
Étiquettes :
1
21
jan.
2024

Bonjour,
Je butte depuis plusieurs heures sur un problème, où j'en suis convaincu, il ne manque qu'un petit détail.
J'ai un fichier testLib.c et un fichier d'entête testLib.h pour créer une biblio libtestLib.so

testLib.c :

#include "testLib.h"

int addition(int a, int b) {
  return a+b;
}

testLib.h :

int addition(int a, int b);

Pour compiler, j'utilise les commandes suivantes :

rm -f testLib.o
gcc -fomit-frame-pointer -O3 -Wunreachable-code -Wextra -Wall -std=gnu17 -fPIC -m64 -march=native -mtune=native -c -o testLib.o testLib.c
rm -f libtestLib.so
gcc -shared -s -o libtestLib.so testLib.o

Le résultat est le fichier libtestLib.so de 14040 octets.

En faisant nm -D libtestLib.so, j'obtiens :

0000000000001100 T addition
                 w __cxa_finalize
                 w __gmon_start__
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable

Pour utiliser cette bibliothèque, le fichier source useTestLib.c fait l'affaire :

#include <stdio.h>
#include "testLib.h"

int main(void) {
  printf("%d\n", addition(2, 3));
  return 0;
}

Pour compiler :

rm -f useTestLib.o
gcc -fomit-frame-pointer -O3 -m64 -Wunreachable-code -Wextra -Wall -std=gnu17 -m64 -march=native -mtune=native -c -o useTestLib.o useTestLib.c

rm -f useTestLib
gcc -s -L. -ltestLib -o useTestLib useTestLib.o

Et là, c'est le drame :

/usr/bin/ld : useTestLib.o : dans la fonction « main » :
useTestLib.c:(.text.startup+0x13) : référence indéfinie vers « addition »
collect2: error: ld returned 1 exit status

Merci de m'avoir lu jusqu'ici. Si en plus, vous aviez une idée…

  • # Il manque `testLib.o`

    Posté par  (site web personnel) . Évalué à 4.

    Étant donné que compilation et édition de liens sont découplées ici, il faut penser à indiquer testLib.o sur la dernière ligne.

    Alternativement, ceci fait le job en une passe :

    gcc useTestLib.c -o useTestLib -ltestLib -L.
    LD_LIBRARY_PATH=$(pwd) ./useTestLib
    

    Debian Consultant @ DEBAMAX

    • [^] # Re: Il manque `testLib.o`

      Posté par  . Évalué à 3.

      Merci de ta réponse.
      Mais pourquoi manquerait-il testLib.o ?
      C'est libtestLib.so que je veux utiliser !

  • # L'ordre des paramètres !

    Posté par  . Évalué à 4. Dernière modification le 21 janvier 2024 à 18:51.

    P'tain, je viens de trouver !
    C'est l'ordre des paramètres dans l'édition de liens.
    Alors là, je suis sur le cul !
    Au lieu de :

    gcc -s -L. -ltestLib -o useTestLib useTestLib.o

    il faut :

    gcc -s -o useTestLib useTestLib.o -L. -ltestLib

    Et tout fonctionne !

  • # Merci

    Posté par  . Évalué à 4.

    C'est la réponse de Cyril Brulebois qui m'a fait essayer les paramètres dans l'ordre de sa proposition.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.