60 votes

Essayer d'inclure une bibliothèque, mais continue à recevoir des messages 'référence non définie à'

Je suis en essayant d'utiliser le libtommath de la bibliothèque. J'utilise 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 résultant .un fichier dans /usr/lib/ et les .h les fichiers dans /usr/include

Il semble être de trouver les fichiers de manière appropriée (depuis je n'ai plus de ces erreurs, que j'ai fait avant de l'installer dans le répertoire /usr répertoires).

Cependant, lorsque je crée une simple principal d'un appel à mp_init (qui est dans la bibliothèque), j'obtiens l'erreur suivante lorsque je tente de faire 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

Ainsi, il ressemble à l'éditeur de liens ne pouvez pas trouver la fonction au sein de la bibliothèque, mais il EST là, donc je ne sais pas ce qui pourrait en être la cause. Toute aide serait appréciée.

Je reçois la même erreur si je tape la commande gcc directement et passez le makefile, j'ai aussi veillé à ce que la bibliothèque statique ai compilé avec gcc en tant que bien.

Edité pour Ajouter:

Je reçois ces mêmes erreurs si je ne le compiler directement et ajouter à la bibliothèque -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é sur ce genre de choses, donc je ne suis pas sûr que je suis en utilisant le bon de commande ici, dans l'-L sont des exemples de bibliothèques être trouvé? Si la bibliothèque n'est pas trouvé comment diable puis-je faire pour trouver la bibliothèque? C'est dans /usr/lib, j'ai essayé avec le .un fichier dans le répertoire courant, etc. Est-il une variable d'environnement que je dois mettre? Si oui, comment, etc.

Merci beaucoup pour l'aide.

J'ai essayé de complètement différent de la bibliothèque (BPF) et a eu exactement le même problème. Cela a obtenu d'être une sorte de Ubuntu problématique de l'environnement? Quelqu'un a une idée de comment résoudre ce problème?

139voto

David Wheeler Points 631

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. Ainsi, lorsque la bibliothèque est AVANT que le module soit compilé, l'éditeur de liens devient confus et ne pense pas qu'aucune des fonctions de la bibliothèque est nécessaire. En plaçant la bibliothèque APRES le module, les références à la bibliothèque dans le module sont résolues par l'éditeur de liens.

41voto

Amol Dalavi Points 161

Oui, il est nécessaire d’ajouter des bibliothèques après les fichiers sources / objets. Cette commande va résoudre le problème:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X