2015-02-08 4 views
0

У меня есть Makefile, чтобы помочь построить мой проект C (GNU Make 3,82). Вот только отрывок:Makefile не обнаруживает изменения зависимостей

OBJ = file1.o file2.o file3.o 

prog: $(OBJ) 
    $(COMP) $(OPT) -o [email protected] 

$(OBJ): header.h 

$(OBJ) не нуждается в команду после того, как это, так как make способен работать это как его делать в остальной части Makefile. Все объекты зависят от этого файла заголовка, поэтому они должны быть перекомпилированы, если я его изменю. Однако они этого не делают. Мой Makefile был основан на этом article.

Примечание: Это работает, если я явно создать правило для каждого файла, например, так:

file1.o: header.h 


Обновление: Я добавил эхо заявление после $(OBJ): header.h линии, чтобы увидеть, если make ловил его, но ничего не делая. К сожалению, он тоже ничего не делает. Поэтому я предполагаю, что это означает, что вся линия зависимостей не работает по какой-то причине.


Вот мой полный Makefile в случае, если я где-то напутал:

CC = clang 
OPT = -std=c99 -Wall -Wextra -g 
LIBS = -lm 
COMP = $(CC) $(OPT) $(LIBS) 
EXEC = checker solver # Binary file(s) 

OBJ = magic_check.o magic_io.o simple_checker.o 

build: $(EXEC) 
    @echo "Building complete." 

solver: checker simple_solver.o 
    $(COMP) simple_solver.o -o [email protected] 

checker: $(OBJ) 
    $(COMP) $(OBJ) -o [email protected] 

%(OBJ): magic_io.h 
    @echo "hello" 

magic_check.o: magic_check.h 
simple_checker.o: simple_checker.h magic_check.h 
simple_solver.o: simple_solver.h 

.PHONY: clean 
clean: 
    rm -f checker solver *.o *~ core 
    @echo "Cleaning... :)" 

rebuild: clean build 
    @echo "Rebuilding..." 
+0

@ user2225104 Это требуется для моего класса, но я понимаю, что вы имеете в виду. –

+1

Какую версию 'make' вы используете (что является первой строкой' make -version')? В частности, это GNU make? – Wintermute

+0

@Wintermute GNU Make 3.82 –

ответ

0

Я загрузил старый Debian с 3.81 сделать, и это работает безупречно (как это должно быть):

OBJ:=file1.o file2.o file3.o main.o 
TARGET:=prog 

$(TARGET): $(OBJ) 
    $(CC) -o [email protected] $(OBJ) 

$(OBJ): test.h 

Результаты:

# make 
cc -c -o file1.o file1.c 
cc -c -o file2.o file2.c 
cc -c -o file3.o file3.c 
cc -c -o main.o main.c 
cc -o prog file1.o file2.o file3.o main.o 
# make 
make: `prog' is up to date. 
# touch test.h 
# make 
cc -c -o file1.o file1.c 
cc -c -o file2.o file2.c 
cc -c -o file3.o file3.c 
cc -c -o main.o main.c 
cc -o prog file1.o file2.o file3.o main.o 

В разница между моим примером и вашим, заключается в том, что ваш %(OBJS) имеет знак %, когда он должен быть $. Кроме того, «работает для меня». У него также не должно быть никаких команд (ваше «эхо» здесь не безвредно).

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