l'éditeur de liens malheurs - undefined reference
Je vais avoir un problème avec mon compilateur me dit "undefined reference to' une fonction que je veux l'utiliser dans une bibliothèque. Permettez-moi de partager quelques infos sur le problème:
- Je suis de la croix de la compilation avec gcc pour C.
- Je suis de l'appel d'une fonction de la bibliothèque qui est accessible par un en-tête qui comprend une autre en-tête, qui contient le prototype.
- J'ai inclus les en-têtes répertoire de l'aide -je, et je suis sûr que c'est d'être trouvé.
- Je suis le premier de la création de l' .o fichiers puis de les relier à une commande séparée.
Donc, ma pensée est qu'il pourrait être l'ordre dans lequel j'inclus les fichiers de la bibliothèque, mais je ne suis pas sûr de ce qui est la façon correcte de les commander. J'ai essayé avec notamment le dossier des en-têtes à la fois avant et après la .o fichier.
Certains disent que ce serait génial, et peut-être et explication de la façon dont l'éditeur de liens ne sa chose.
Merci!
Réponse à des réponses
- il n'est pas .un fichier de bibliothèque, juste .h et .c dans la bibliothèque, donc -l n'est pas appropriée
- ma compréhension d'un fichier de bibliothèque, c'est que c'est juste un ensemble d'en-tête et les fichiers sources, mais c'est peut-être une collection de .o les fichiers créés à partir de la source?!
- il n'y a pas de bibliothèque de fichier de l'objet en cours de création, peut-être qu'il devrait l'être??? Oui semble que je ne comprends pas la différence entre les comprend et les bibliothèques...je vais travailler sur ça 🙂
Merci pour toutes les réponses! J'ai beaucoup appris sur les bibliothèques. J'aimerais mettre toutes les réponses que l'on a accepté la réponse 🙂
OriginalL'auteur Richard | 2008-09-27
Vous devez vous connecter pour publier un commentaire.
Il semble que vous ne sont pas de la compilation de l' .c fichier dans la bibliothèque pour produire une .o fichier. L'éditeur de liens allaient chercher le prototype de la mise en œuvre dans le .o fichier produit par la compilation de la bibliothèque
Est-ce que votre processus de construction de la compilation de la bibliothèque .fichier c?
Pourquoi l'appelez-vous une "bibliothèque" s'il fait juste le code source?
OriginalL'auteur Peter K.
Les en-têtes de fournir les déclarations de fonction et des définitions de fonction. Pour permettre à l'éditeur de liens trouver la fonction de mise en œuvre (et de se débarrasser de la référence non définie) vous devez vous poser, le pilote du compilateur (gcc) afin de lier la bibliothèque spécifique où la fonction réside à l'aide de l'option-l. Par exemple, -lm lien de la bibliothèque de mathématiques. Une fonction de la page de manuel généralement spécifie ce que la bibliothèque, le cas échéant, doit être spécifié pour trouver la fonction.
Si l'éditeur de liens ne pouvez pas trouver une bibliothèque spécifiée, vous pouvez ajouter un chemin de recherche des bibliothèques en utilisant le commutateur-L (par exemple, -L/usr/local/lib). Vous pouvez également affecter de façon permanente le chemin de la bibliothèque par le biais de la LIBRARY_PATH variable d'environnement.
Voici quelques informations supplémentaires pour vous aider à déboguer votre problème. Par convention, les noms de fichiers de la bibliothèque sont préfixés avec lib et (dans leur forme statique) ont une .une extension. Ainsi, la statiquement version du système par défaut de la bibliothèque math (l'un de vous lier avec -lm) se trouve généralement dans /usr/lib/libm.un. Pour voir ce que les symboles d'une bibliothèque donnée définit vous pouvez exécuter nm --défini uniquement sur le fichier de la bibliothèque. Sur mon système, exécutez la commande sur libm.un me donne la sortie du suivant.
Pour voir le chemin de la bibliothèque que votre compilateur utilise et qui bibliothèques, il se charge par défaut vous pouvez appeler gcc avec l'option-v. De nouveau, sur mon système, cela donne le résultat suivant.
.h
par défaut) contenir toute sorte de source C, mais c'est fortement déconseillé de placer quoi que ce soit mais les définitions de macros et déclarations.OriginalL'auteur Diomidis Spinellis
J'ai peur de vous mixte de la bibliothèque et de l'en-tête de concepts.
Disons que vous avez une bibliothèque
libmylib.a
qui contient la fonctionmyfunc()
et un en-tête correspondantmylib.h
qui définit son prototype. Dans votre fichier sourcemyapp.c
vous inclure l'en-tête, soit directement, soit, y compris un autre en-tête qui l'inclut. Par exemple:votre fichier source ressemble:
Maintenant, vous pouvez le compiler pour obtenir
myapp.o
:Noter que l'-je dit juste gcc où les en-têtes de fichiers, ils n'ont rien à voir avec la bibliothèque elle-même!
Maintenant, vous pouvez lier votre application avec le réel de la bibliothèque:
Noter que le
-L
commutateur indique gcc où la bibliothèque est, et la-l
indique le lien de votre code à la bibliothèque.Si vous ne le faites pas cette dernière étape, vous pouvez rencontrer le problème que vous avez décrit.
Il pourrait y avoir d'autres cas plus complexes, mais à partir de votre question, j'espère que cela ne serait pas suffisant pour résoudre votre problème.
OriginalL'auteur Remo.D
Post votre makefile, et la fonction de la bibliothèque que vous essayez d'appeler. Même de simples gcc makefiles ont généralement une ligne comme ceci:
Dans ce cas, cela signifie que le lien de la bibliothèque standard C, entre autres
OriginalL'auteur Jeff
Je suppose que vous devez ajouter le chemin d'accès où le linker peut trouver le libraray. Dans gcc/ld vous pouvez le faire avec -L et libraray avec-l.
Alors vous pourriez avoir à créer de la libraray premier?
OriginalL'auteur jk.
J'ai rencontré ce problème lors de la construction d'un programme avec une nouvelle version de gcc. Le problème a été résolu par l'appel de gcc avec l'option-std=gnu89 option. Apparemment, cela est dû à la fonction inline déclarations. J'ai trouvé cette solution à https://gcc.gnu.org/gcc-5/porting_to.html
OriginalL'auteur mvi