Не уверен, если это вызывает вашу конкретную проблему, но две строки:
a_functions.c: a.h
main.c: main.h
определенно ошибочны, потому что, как правило, нет команды для воссоздания файла C на основе заголовка, который он включает.
C-файлы не зависят от заголовочных файлов, объекты , созданные этими C-файлами.
Например, main.c
из:
#include <hdr1.h>
#include <hdr2.h>
int main (void) { return 0; }
будет в makefile
примерно так:
main.o: main.c hdr1.h hdr2.h
gcc -c -o main.o main.c
Изменение:
a_functions.o: a_functions.c
a_functions.c: a.h
main.o: main.c
main.c: main.h
до:
a_functions.o: a_functions.c a.h
main.o: main.c main.h
(при условии, что a_functions.c
включает a.h
, а main.c
включает main.h
) и повторите попытку.
Если приведенное выше предположение неверно, вам придется сообщить нам, какие файлы C включают в себя и какие заголовки, чтобы мы могли сообщить вам правильные правила.
Если вы утверждаете, что makefile
все еще строит все, даже после этих изменений, вам нужно взглянуть на две вещи.
Первый - это вывод ls -l
для всех соответствующих файлов, чтобы вы могли видеть, какие у них даты и время.
Второй фактический вывод из make
. Вывод make -d
будет особенно полезен, поскольку он показывает , какие файлы и даты make
использует, чтобы выяснить, что делать.
Что касается расследования, make
, кажется, работает нормально согласно следующей расшифровке:
=====
pax$ cat qq.h
#define QQ 1
=====
pax$ cat qq.c
#include "qq.h"
int main(void) { return 0; }
=====
pax$ cat qq.mk
qq: qq.o
gcc -o qq qq.o
qq.o: qq.c qq.h
gcc -c -o qq.o qq.c
=====
pax$ touch qq.c qq.h
=====
pax$ make -f qq.mk
gcc -c -o qq.o qq.c
gcc -o qq qq.o
=====
pax$ make -f qq.mk
make: `qq' is up to date.