web-dev-qa-db-fra.com

En-tête d'inclusion de makefile

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!");
}
15
para

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.

11
bitmask

vous n'avez pas compilé le fichier inc.c

app: main.c inc.h
    cc -o app main.c inc.c
3
Miguel Prz

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
0
Arild