web-dev-qa-db-fra.com

Compiler plusieurs fichiers C avec gcc

J'ai deux fichiers, main.o et modules.o, et j'essaye de les compiler pour que main.o peut appeler des fonctions dans modules.o. On m'a explicitement dit de ne pas essayer #include module.o. Je ne sais vraiment pas ce que je devrais faire à la place. J'ai essayé plusieurs versions différentes de gcc (telles que gcc -x c driver main.o modules.o), mais rien de ce que je reçois ne fonctionne: le compilateur retourne continuellement

error: called object is not a function

Le .o les fichiers sont mes fichiers de code source (on m'a demandé de mettre mon code source dans des fichiers avec l'extension .o.) Que dois-je faire pour compiler cela?

12
vaindil

Vous devez définir les fonctions que vous souhaitez appeler à partir de modules.c en main.c dans un fichier d'en-tête, disons modules.h, et incluez ce fichier d'en-tête dans main.c. Une fois que vous avez le fichier d'en-tête, veuillez compiler les deux fichiers ensemble: gcc main.c modules.c -o output


Deux notes supplémentaires. Premier, modules.o est un fichier objet et ne doit pas être inclus dans un fichier source C. Deuxièmement, un fichier C ne peut pas avoir un .o extension. Vous devriez en fait obtenir une erreur lors de la compilation d'un .o fichier. Quelque chose comme:

$ cat t.o
int main() {
    int x = 1;
    return 0;
}
$
$ gcc t.o
ld: warning: in t.o, file is not of required architecture
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
$
9
Manoj Pandey

Si vous avez vos deux fichiers source, vous pouvez les compiler en fichiers objet sans les lier, comme suit:

gcc main.c -o main.o -c
gcc module.c -o module.o -c

où le -c L'indicateur indique au compilateur de s'arrêter après la phase de compilation, sans liaison. Ensuite, vous pouvez lier vos deux fichiers objets comme suit:

gcc -o myprog main.o module.o

C'est un comportement parfaitement normal, vous obtiendrez généralement votre makefile pour compiler les choses séparément et les lier à la fin, de sorte que vous n'avez pas à recompiler chaque fichier source à chaque fois que vous modifiez l'un d'entre eux.

Parler de main.o "appeler des fonctions dans" module.o est parfaitement bien, mais un .o le fichier n'est pas un fichier source, c'est un fichier objet compilé. Si "mettez mon code source dans des fichiers avec l'extension .o "signifiait réellement" compiler mon code source dans des fichiers avec l'extension .o "alors la situation aurait beaucoup plus de sens.

23
Paul Griffiths

Vous devez inclure .h fichiers qui sont des "en-têtes". Donc, si votre fichier principal utilise des modules, vous devez inclure le fichier d'en-tête du module.

2
Sarp Kaya