Comment puis-je lier des fichiers de l'objet en C? Échoue avec “les symboles non définis pour l'architecture x86_64”
Donc je suis en train d'essayer d'utiliser une fonction définie dans un autre C (fichier1.c) le fichier dans mon dossier (fichier2.c). Je suis, y compris l'en-tête de fichier1 (fichier1.h) pour ce faire.
Cependant, je reçois l'erreur suivante lorsque j'essaie de compiler mon fichier à l'aide de gcc:
Undefined symbols for architecture x86_64:
"_init_filenames", referenced from:
_run_worker in cc8hoqCM.o
"_read_list", referenced from:
_run_worker in cc8hoqCM.o
ld: symbol(s) not found for architecture x86_64
J'ai dit que j'ai besoin de "lier les fichiers objets ensemble", afin d'utiliser les fonctions de fichier1 en fichier2, mais je n'ai aucune idée de ce que cela signifie 🙁
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous êtes en utilisant
gcc
, simplement des objets de liaison de fichiers à faire:Pour obtenir l'objet-les fichiers de simplement compiler à l'aide de
cela donne fichier1.o et ainsi de suite.
Si vous souhaitez lier votre fichiers à un fichier exécutable ne
librt.so
). Si au-delà de la portée de cette question, pouvez-vous donner un lien vers une autre question plus complexe?main.c
dans cette réponse? :/ si file1.c est le principal, comment voulez-vous lier avec d'autres déjà compilé .o fichiers?#include
est une commande du préprocesseur qui se met (copie) le contenu de votre fichier include dans le fichier avec la#include
déclaration. Cela n'a rien à voir avec la compilation elle-même. Je ne voudrais pas réellement l'utiliser pour inclure un c-fichier, mais plutôt que les fichiers d'en-tête.La les réponses existantes couvrent déjà le "comment", mais je voulais juste de donner des précisions sur le "quoi" et "pourquoi" pour les autres, qui peut-être vous demandez-vous.
Ce qu'est un compilateur (gcc): Le terme de "compiler" est un peu surchargé terme, car il est utilisé à un haut niveau pour dire "convertir le code source d'un programme", mais techniquement plus moyen de "convertir le code source, code objet". Un compilateur comme gcc a en fait deux, mais sans doute des fonctions distinctes pour activer votre code source dans un programme: la compilation (comme dans la dernière définition de tournage de source en code objet) et la liaison (le processus de combinaison de l'objet nécessaire fichiers de code en un seul exécutable complet).
L'erreur d'origine que vous avez vu est techniquement un "liant " erreur", et est jeté par "ld", l'éditeur de liens. Contrairement à la (stricte) des erreurs de compilation, il n'y a aucune référence à des lignes de code source, comme l'éditeur de liens est déjà dans l'espace objet.
Par défaut, lors de la gcc est donné le code source en entrée, il tente de compiler chaque et de les lier ensemble. Comme indiqué dans les autres réponses, il est possible d'utiliser les drapeaux pour instruire gcc pour seulement compiler d'abord, puis l'utilisation des fichiers de l'objet plus tard d'un lien dans une étape distincte. Ce processus en deux étapes peut sembler inutile (et est probablement le cas pour les très petits programmes), mais il est très important lors de la gestion d'un programme très important, où la compilation de l'ensemble du projet à chaque fois que vous faire une petite modification serait gaspiller une quantité considérable de temps.
.h
dans#include "sum.h"
, par exemple. Si vous incluez un code source en C, alors vous n'avez pas besoin de lien. En général c'est une mauvaise pratique.Vous pouvez compiler et lier en une seule commande:
Et de courir avec:
Mais pour répondre à la question posée, il suffit de passer les fichiers objets à
gcc
:Ajouter toto1.c , foo2.c , foo3.c et makefile dans un dossier
le type de faire en bash
si vous ne souhaitez pas utiliser le makefile, vous pouvez exécuter la commande
puis
toto1.c
foo2.c
foo3.c
makefile
Car il n'y a aucune mention de la façon de compiler un .c fichier avec un tas de .o fichiers, et ce commentaire vous le demande:
$ gcc main.c lib_obj1.o lib_obj2.o lib_objN.o-o x0rbin
Ici, principale.c est le C fichier avec la fonction main() et les fichiers objets (*.o) sont précompilés. GCC sait comment gérer ces ensemble et il fait appel à l'éditeur de liens en conséquence et les résultats dans un exécutable final, qui dans notre cas est x0rbin.
Vous serez en mesure d'utiliser les fonctions ne sont pas définis dans la main.c mais à l'aide d'un extern référence à des fonctions définies dans l'objet les fichiers (*.o).
Vous pouvez aussi le lien avec .obj ou d'autres extensions si l'objet fichiers ont le bon format (COFF).