2013-03-15 2 views
14

Я новичок в программировании Linux. Я попытался скомпилировать простую конструкцию теста. Но при компиляции я получаю сообщение об ошибке. Добавление inc.c также (в строке приложения: не работает). Как включить файл правильно?Makefile include header

Makefile:

app: main.c inc.h 
    cc -o app main.c 

Терминал:

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 

main.c:

#include <stdio.h> 
#include "inc.h" 

int main() 
{ 
    printf("Kijken of deze **** werkt:\n"); 
    test(); 

    getchar(); 
    return 0; 
} 

inc.h

#ifndef INCLUDE_H 

#define INCLUDE_H 

void test(); 

#endif 

inc.c

#include <stdio.h> 

void test() 
{ 
    printf("Blijkbaar wel!"); 
} 

ответ

10

Вы должны связать с блоком inc.o компиляции, который вы получить путем компиляции inc.c.

В общем, это означает, что вы должны предоставить все объектные файлы, содержащие функции, которые используются в main.c (транзитивно). Вы можете скомпилировать их с неявными правилами make, не нужно указывать дополнительные правила.

Вы могли бы сказать:

app: main.c inc.o inc.h 
    cc -o app inc.o main.c 

И make будет знать, сама по себе, как компилировать inc.o из inc.c хотя он не принимать inc.h во внимание при определении, должен ли быть восстановлен inc.o. Для этого вы найдете . должны указать свои собственные правила.

2

вы не компиляции файла inc.c

app: main.c inc.h 
    cc -o app main.c inc.c 
-1

Вы должны скомпилировать inc.c, а также. Подходящий подход (лучше масштабируемый для более крупных приложений) заключается в том, чтобы разбить Makefile на разные цели. Идея такова: одна цель для каждого объектного файла, а затем одна цель для финального двоичного файла. Для компиляции объектных файлов используйте аргумент -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

Почему вы помещаете заголовочный файл в 'cc -c main.c inc.h' и' cc -c inc.c inc.h'? – navigaid

Смежные вопросы