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: puis, un fichier d'objet ex_addinst.o est génétiqué avec un avertissement: puis je les fuit avec p> et obtenir les informations suivantes: p> 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
4 Réponses :
OK, 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. P>
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. P> lindo.h code> 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. p>
Merci Praetorien, vous avez raison, il n'y a que des prototypes à Lindo.h, je vais chercher leurs définitions.
Essayez p>
g ++ -wall -o ex_addinst ex_addinst. C fort> p>
au lieu de p>
g ++ -wall -o ex_addinst ex_addinst.o p>
Vous voulez compiler le fichier .C, pas le fichier .O. p>
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 ... code>), la deuxième ligne indique au compilateur de lier Objets i> dans un binaire exécutable.
Droit! Mon erreur. Merci les gars!
Référence non définie à ... code> 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 em>: 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 code> /
-l code> options de g ++.
man g ++ code> est toujours une bonne lecture et la documentation de la limbe devrait également être. p>
Merci psycho, j'ai trouvé la bibliothèque avec * .so dossiers, j'essaie de les relier.
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. P>
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/...