сделайте всегда восстанавливают

Мой 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, и ничего не делая сохраняют изменения, и все работали. Я думаю, что вещь метки даты была починена, делая это.

12
задан fsdfa 18 April 2010 в 01:24
поделиться

3 ответа

Ваше первое правило:

test: $(OBJS)

Это означает, что если файл с именем 'test' не существует, правило должно выполняться и создавать его. Поскольку «test» никогда не существует (это правило фактически не создает файл с именем «test»), оно запускается каждый раз. Вы должны изменить 'test' на 'a', фактический результат этого правила

. Для справки в будущем, если правило не создает объект слева, вы должны пометить его:

.PHONY: test
14
ответ дан 2 December 2019 в 19:31
поделиться

Вам необходимо указать, что 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).

2
ответ дан 2 December 2019 в 19:31
поделиться

В крайнем случае вы можете запустить Make в режиме отладки (make -d) и просмотреть вывод. Перед тем, как попробовать это, я предлагаю вам добавить строку в правило «test», чтобы увидеть, есть ли какие-либо предварительные условия, которые, по мнению Make, требуют перестройки теста (и в качестве хорошей практики используйте некоторые автоматические переменные в команде компиляции).

test: $(OBJS)
    @echo prereqs that are newer than test: $?
    $(CC) $(FLAGS) $^ -o $@
2
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: