it-swarm.dev

Essayer d'inclure une bibliothèque, mais continue à recevoir des «références non définies» aux messages

J'essaie d'utiliser la bibliothèque libtommath. J'utilise les NetBeans IDE pour mon projet sur Ubuntu linux. J'ai téléchargé et construit la bibliothèque, j'ai fait un 'make install' pour mettre le fichier .a résultant dans/usr/lib/et les fichiers .h dans/usr/include

Il semble trouver les fichiers de manière appropriée (car je ne reçois plus ces erreurs, ce que j'ai fait avant d'installer dans les répertoires/usr).

Cependant, lorsque je crée un simple main effectuant un appel à mp_init (qui se trouve dans la bibliothèque), j'obtiens l'erreur suivante lorsque j'essaie de créer mon projet:

mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c
mkdir -p dist/Debug/GNU-Linux-x86
gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o
build/Debug/GNU-Linux-x86/main.o: In function 'main':
/home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1

Donc, il semble que l'éditeur de liens ne puisse pas trouver la fonction dans la bibliothèque, mais il IS là-bas, donc je ne sais pas ce qui pourrait provoquer cela.

J'obtiens la même erreur si je tape directement la commande gcc et que je saute le makefile, je me suis également assuré que la bibliothèque statique était également compilée avec gcc.

Modifié pour ajouter:

J'obtiens ces mêmes erreurs si je fais la compilation directement et ajoute la bibliothèque avec -l ou -L:

$ gcc -l /usr/lib/libtommath.a main.c 
/usr/bin/ld: cannot find -l/usr/lib/libtommath.a
collect2: ld returned 1 exit status

$ gcc -llibtommath.a main.c 
/usr/bin/ld: cannot find -llibtommath.a
collect2: ld returned 1 exit status

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

Je suis très rouillé à ce sujet, donc je ne suis pas sûr d'utiliser la bonne commande ici, dans les exemples -L, les bibliothèques sont-elles trouvées? Si la bibliothèque n'est pas trouvée, comment diable puis-je l'obtenir pour trouver la bibliothèque? C'est dans/usr/lib, je l'ai essayé avec le fichier .a dans le répertoire courant, etc. Y a-t-il une variable d'environnement que je dois définir? Si oui, comment, etc.

J'ai essayé une bibliothèque complètement différente (GMP) et j'ai eu le même problème EXACT. Cela doit être une sorte de problème d'environnement Ubuntu? Quelqu'un a-t-il une idée de la façon de résoudre ce problème?

57
KU1

L'astuce ici est de mettre la bibliothèque APRÈS le module que vous compilez. Le problème est une chose de référence. L'éditeur de liens résout les références dans l'ordre, donc lorsque la bibliothèque est AVANT la compilation du module, l'éditeur de liens est confus et ne pense pas que les fonctions de la bibliothèque soient nécessaires. En plaçant la bibliothèque APRÈS le module, les références à la bibliothèque dans le module sont résolues par l'éditeur de liens.

135
David Wheeler

Oui, il est nécessaire d'ajouter des bibliothèques après les fichiers source/fichiers objets. Cette commande résoudra le problème:

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath
40
Amol Dalavi

Si les fichiers source .c sont convertis en .cpp (comme en parsec), l'extern doit être suivi de "C" comme dans

extern "C" void foo();
5
user3342227