Makefile включает заголовок - программирование
Подтвердить что ты не робот

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!");
}
4b9b3361

Ответ 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