Makefile включает заголовок
Я новичок в программировании Linux. Я попытался скомпилировать простую конструкцию теста. Но при компиляции я получаю сообщение об ошибке. Добавление inc.c также (в строке приложения: не работает). Как включить файл правильно?
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!");
}
Ответы
Ответ 1
Вы должны установить ссылку на блок компиляции 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.o
, он не принимает inc.h
. Для этого вам нужно будет указать свои собственные правила.
Ответ 2
вы не скомпилировали файл inc.c
app: main.c inc.h
cc -o app main.c inc.c
Ответ 3
Вам нужно также скомпилировать 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.o: inc.c inc.h
cc -c inc.c