Я учу, как настроить make-файлы и столкнулся с проблемой. Чтобы продемонстрировать это, я создал простой «проект», состоящий из исходных файлов main.m
и test.m
.Makefile всегда перекомпилирует файл
Я пытаюсь настроить сделать, чтобы скомпилировать эти файлы (только если нечто изменилось), а также хранить объектные файлы где-нибудь еще (здесь build/
)
Мой Makefile:
OBJ = ./build
SOURCES=main.m test.m
OBJECTS=$(addprefix $(OBJ)/,$(SOURCES:.m=.o))
EXECUTABLE=test
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
gcc $(OBJECTS) -o $(EXECUTABLE)
$(OBJECTS): $(OBJ)/%.o: %.m build/
gcc -c $< -o [email protected]
build/:
mkdir build
Когда я бегу это в первый раз (с только Makefile и источников в текущем каталоге) это то, что я ожидаю, что это сделать:
gcc -c main.m -o build/main.o
gcc -c test.m -o build/test.o
gcc ./build/main.o ./build/test.o -o test
Однако, если я бегу make
еще раз:
gcc -c main.m -o build/main.o
gcc ./build/main.o ./build/test.o -o test
Что я сделал не так? Также отмечаем, что любые другие ошибки в Makefile оцениваются, поскольку я пытаюсь научиться создавать «хорошие» Make-файлы.
EDIT:
То, что я заметил из make -d
:
Finished prerequisites of target file `build/main.o'.
Prerequisite `main.m' is older than target `build/main.o'.
Prerequisite `build/' is older than target `build/main.o'.
No need to remake target `build/main.o'.
и
Finished prerequisites of target file `build/test.o'.
Prerequisite `test.m' is older than target `build/test.o'.
Prerequisite `build/' is newer than target `build/test.o'.
Must remake target `build/test.o'.
Я думаю, что вы просто не хотите '/' 'прилагается к build' в пару мест. Позвольте мне попробовать это здесь. Вы можете использовать 'make -d', чтобы увидеть, как' make' принимает решения о том, что нужно строить, если это помогает. –
Спасибо. Однако маршрут 'make -d' займет некоторое время, когда он выводит 927 строк информации :) – varesa
Вы можете успокоить это, избавившись от такого количества неявных правил, как posisble. Я просто попробовал ваш make-файл здесь, хотя и с простым тестовым проектом, и, похоже, он работал так, как ожидалось. То есть, во втором запуске я просто получаю 'make: ничего не делать для 'all'''. –