Мой Make-файл:
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
снова, это всегда восстанавливает 'тест'. Почему это делает это?
Даже если я делаю: make a.o
это восстанавливает... Я нахожусь на Linux, если это помогает.
В окнах, если я изменяю 'тест' 'test.exe' и тест '-o' '-o test.exe', он хорошо работает. Таким образом, я предполагаю, что по некоторым причинам 'делают' в моей проверке наклона Linux метки даты моих файлов в каталоге.
Я ЗАФИКСИРОВАЛ IT!.c были созданы в Windows. Я открыл весь.c, и.h в vi, и ничего не делая сохраняют изменения, и все работали. Я думаю, что вещь метки даты была починена, делая это.
Ваше первое правило:
test: $(OBJS)
Это означает, что если файл с именем 'test' не существует, правило должно выполняться и создавать его. Поскольку «test» никогда не существует (это правило фактически не создает файл с именем «test»), оно запускается каждый раз. Вы должны изменить 'test' на 'a', фактический результат этого правила
. Для справки в будущем, если правило не создает объект слева, вы должны пометить его:
.PHONY: test
Вам необходимо указать, что test является фальшивой целью :
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
Я поместил сначала all , так что это цель по умолчанию (что часто бывает), удалил команды для компиляции (make уже имеет встроенные) и изменил FLAGS - CFLAGS (это общее имя для флагов компилятора C и используется встроенными правилами make).
В крайнем случае вы можете запустить Make в режиме отладки (make -d) и просмотреть вывод. Перед тем, как попробовать это, я предлагаю вам добавить строку в правило «test», чтобы увидеть, есть ли какие-либо предварительные условия, которые, по мнению Make, требуют перестройки теста (и в качестве хорошей практики используйте некоторые автоматические переменные в команде компиляции).
test: $(OBJS)
@echo prereqs that are newer than test: $?
$(CC) $(FLAGS) $^ -o $@