8
votes

Référence non définie à la fonction déclarée dans * .h fichier

Je suis un programmeur non qualifié et nouveau à Linux, je rencontre un problème lors de la complication. J'ai deux fichiers 'ex_addinst.c' et 'lindo.h' dans le même dossier, la commande saisie de l'entrée: xxx pré>

puis, un fichier d'objet ex_addinst.o est génétiqué avec un avertissement: xxx pré>

puis je les fuit avec p> xxx pré>

et obtenir les informations suivantes: p> xxx Pré>

Je suppose que le fichier d'en-tête 'lindo.h' n'est pas respecté dans le fichier .O, mais je ne sais pas quoi faire maintenant. J'ai essayé GCC, mais obtenez la même erreur. La version de My G ++ et GCC est 4.4.5. J'utilise Ubuntu 10.10. P>

Toutes les fonctions et les structures ont été déclarées dans 'lindo.h'. P>

une partie de ex_addinst.c est la suivante: p>

ln -sf liblindo64.so.6.0 liblindo64.so


2 commentaires

Vous avez probablement quelque part dans le fichier d'arbre Dir appelé Liblindo.a ou similaire. Vous devez ajouter un chemin à ce fichier à la liaison (avec -LSomewhere) et liez cette bibliothèque avec -llindo


Quelqu'un utilise-t-il Eclipse, vous devriez regarder: Stackoverflow.com/questions/16052148/...


4 Réponses :


19
votes

OK, lindo.h contient les prototypes de ces fonctions, mais où sont définies les fonctions? S'ils sont dans un autre fichier C, vous devez compiler celui-ci également et liez les fichiers d'objet ensemble.

Si les fonctions font partie d'une autre bibliothèque statique, vous devez indiquer à la liaison de relier cette bibliothèque avec votre fichier d'objet.

S'ils sont définis avec une bibliothèque partagée, vous pouvez probablement obtenir G ++ pour y être toujours associé au moment de la compilation et prendre soin du chargement de la bibliothèque, etc. Sinon, vous devez charger la bibliothèque à l'exécution et référencer la fonctions de la bibliothèque. Cet article Wikipedia sur Chargement dynamique de bibliothèques partagées contient un exemple de code.


1 commentaires

Merci Praetorien, vous avez raison, il n'y a que des prototypes à Lindo.h, je vais chercher leurs définitions.



1
votes

Essayez

g ++ -wall -o ex_addinst ex_addinst. C

au lieu de

g ++ -wall -o ex_addinst ex_addinst.o

Vous voulez compiler le fichier .C, pas le fichier .O.


3 commentaires

Dans ce cas, il s'agit simplement de lier. Il a été compilé avant (lisez la question à nouveau).


Il a déjà compilé le fichier source (ligne de code CF, gcc -c ... ), la deuxième ligne indique au compilateur de lier Objets dans un binaire exécutable.


Droit! Mon erreur. Merci les gars!



1
votes

Référence non définie à ... n'est pas un problème de déclaration. Le compilateur échoue car il ne peut pas trouver de symboles (objets) liés à ces fonctions déclarées.
Dans votre cas, vous utilisez l'API Limbo et incluez le fichier d'en-tête, mais vous ne dites pas au compilateur de relier la bibliothèque: c'est pourquoi il ne trouve pas de symboles.
Edit : J'avais oublié la partie lorsque vous dites que vous êtes nouveau à Linux. Pour créer un lien avec la bibliothèque, vous devez utiliser le -L / -l options de g ++. man g ++ est toujours une bonne lecture et la documentation de la limbe devrait également être.


1 commentaires

Merci psycho, j'ai trouvé la bibliothèque avec * .so dossiers, j'essaie de les relier.



1
votes

Vous devez dire à GCC de créer un lien avec la bibliothèque ou le ou les fichiers d'objet contenant les fonctions LS ... les fonctions que vous utilisez. Le fichier d'en-tête indique au compilateur comment les appeler, mais la liaison doit savoir où obtenir le code compilé de.


0 commentaires