Всегда перестраивать
Мой файл Makefile:
OBJS = b.o c.o a.o
FLAGS = -Wall -Werror
CC = gcc
test: $(OBJS)
$(CC) $(FLAGS) $(OBJS) -o test
b.o: b.c b.h
$(CC) $(FLAGS) -c b.c
a.o: a.c b.h c.h
$(CC) $(FLAGS) -c a.c
c.o: c.c c.h
$(CC) $(FLAGS) -c c.c
clean:
rm a
rm *.o
all: test
Если я снова make
, затем make
, он всегда перестраивает 'test'. Почему это делается?
Даже если я делаю: make a.o
он перестраивает... Im on linux, если это помогает.
В Windows, если я меняю 'test' на 'test.exe' и '-o test' на '-o test.exe', он отлично работает.
Поэтому я предполагаю, что по какой-то причине "make" в моем linux не может проверять datestamps моих файлов в каталоге.
Я ИСПРАВЛЯЛ ЭТО!
.c были созданы в Windows. Я открыл все .c и .h в vi, и ничего не сделал, кроме изменений, и все сработало. Я думаю, что исправленная вещь была исправлена.
Ответы
Ответ 1
Ваше первое правило:
test: $(OBJS)
Это означает, что если файл с именем "test" не существует, это правило должно запускаться и создавать его. Поскольку "тест" никогда не существует (это правило фактически не создает файл с именем "test" ), он запускается каждый раз. Вы должны изменить 'test' на 'a', фактический вывод этого правила
В будущем, если правило фактически не создает предмет с левой стороны, вы должны пометить его следующим образом:
.PHONY: test
Ответ 2
Вам нужно указать, что тест фальшивая цель:
OBJS = b.o c.o a.o
CFLAGS = -Wall -Werror
CC = gcc
.PHONY: all test clean
# 'all' and 'clean' are also phony
all: test
test: a
a: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o a
b.o: b.c b.h
a.o: a.c b.h c.h
c.o: c.c c.h
clean:
rm a
rm *.o
Я поместил все сначала так, чтобы это была цель по умолчанию (которая является общей), удалили команды для компиляции (make уже имеют встроенные) и изменили FLAGS на CFLAGS (что является общим именем для компилятора C флаги и используются встроенными правилами).
Ответ 3
В качестве последнего средства вы можете запустить Make в режиме отладки (make -d) и расчесывать результат. Прежде чем пытаться это сделать, я предлагаю вам добавить строку в правило "тест", чтобы увидеть, есть ли какие-либо предпосылки, которые заставят думать, что требуется перестройка теста (и использовать некоторые автоматические переменные в команде компиляции в качестве хорошей практики).
test: $(OBJS)
@echo prereqs that are newer than test: $?
$(CC) $(FLAGS) $^ -o [email protected]