Подтвердить что ты не робот

Всегда перестраивать

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

4b9b3361

Ответ 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]