сделать всегда перестраивать - PullRequest
12 голосов
/ 18 апреля 2010

Мой 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 он перестраивается ... Я в Linux, если это помогает.

В Windows, если я меняю 'test' на 'test.exe 'и' -o test 'от' -o test.exe ', работает нормально.Поэтому я думаю, что по какой-то причине «make» в моем linux не может проверить метки даты моих файлов в каталоге.

Я ИСПРАВЛЕН!.C были созданы в Windows.Я открыл все .c и .h в vi, и ничего не делая, кроме изменений, и все заработало.Я думаю, что дата-метка была исправлена ​​при этом.

Ответы [ 3 ]

14 голосов
/ 18 апреля 2010

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

test: $(OBJS)

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

Для дальнейшего использования, если правило на самом деле не создает предмет с левой стороны, вы должны пометить его как

.PHONY: test
2 голосов
/ 18 апреля 2010

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

test: $(OBJS)
    @echo prereqs that are newer than test: $?
    $(CC) $(FLAGS) $^ -o $@
2 голосов
/ 18 апреля 2010

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

Сначала я поместил все , так что это цель по умолчанию (что является общим), удалил команды для компиляции (в make уже есть встроенные) и изменил FLAGS to CFLAGS (это общее название для флагов компилятора C и используется встроенными правилами make).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...