Je suis nouveau dans la programmation Linux, j'ai essayé de compiler une construction de test simple. Mais je reçois une erreur lors de la compilation. L'ajout de inc.c également (dans l'application: ligne) ne fonctionne pas. Comment dois-je inclure le fichier correct?
Makefile:
app: main.c inc.h
cc -o app main.c
Terminal:
make
cc -o app main.c
/tmp/ccGgdRNy.o: In function `main':
main.c:(.text+0x14): undefined reference to `test'
collect2: error: ld returned 1 exit status
make: *** [app] Error 1
principal c:
#include <stdio.h>
#include "inc.h"
int main()
{
printf("Kijken of deze **** werkt:\n");
test();
getchar();
return 0;
}
pouce
#ifndef INCLUDE_H
#define INCLUDE_H
void test();
#endif
inc.c
#include <stdio.h>
void test()
{
printf("Blijkbaar wel!");
}
Vous devez établir un lien avec l'unité de compilation inc.o
obtenue en compilant inc.c
.
En général, cela signifie que vous devez fournir tous les fichiers objet contenant des fonctions utilisées dans main.c
(de manière transitoire). Vous pouvez les compiler avec des règles implicites de make
, inutile de spécifier des règles supplémentaires.
Tu pourrais dire:
app: main.c inc.o inc.h
cc -o app inc.o main.c
Et make
saura comment compiler inc.o
à partir de inc.c
même si pas _ prendra inc.h
en compte pour déterminer si inc.o
doit être reconstruit. Pour cela, vous voudriez spécifier vos propres règles.
vous n'avez pas compilé le fichier inc.c
app: main.c inc.h
cc -o app main.c inc.c
Vous devez également compiler inc.c
. Une approche appropriée (mieux évolutive pour des applications plus grandes) serait de scinder le Makefile en différentes cibles. L'idée est la suivante: une cible pour chaque fichier objet, puis une cible pour le binaire final. Pour compiler les fichiers objet, utilisez l'argument -c
.
app: main.o inc.o
cc -o app main.o inc.o
main.o: main.c inc.h
cc -c main.c inc.h
inc.o: inc.c inc.h
cc -c inc.c inc.h