Makefile: почему работает этот метод автоматической генерации предпосылок?
Я читаю Makefile, и я нахожу способ автоматического создания предпосылок, который отличается от этого урока. Этот метод выглядит следующим образом:
DEPFILES = $(SRCFILES:src/%.cpp=obj/%.d)
-include $(DEPFILES)
obj/%.o: src/%.cpp | obj
@echo compiling $(@F) ...
@$(CXX) -O3 -ggdb $(CXXFLAGS) -c -o $(@) -MMD -MP $(<)
obj:
@mkdir $@
Я мог бы выяснить, как gcc генерирует файлы.d, когда я впервые выполняю make
команда, -include $(DEPFILES)
потерпит неудачу и obj/%.o
Будет вызываться target и генерировать файлы.d. Но моя проблема: когда я изменяю некоторые исходные файлы и делаю make
опять что будет? Я думаю -include $(DEPFILES)
Будет ли успех и файлы.d включены в make-файл, поэтому obj/%.o
target в.d файлах включены в make-файл, но на самом деле я уже определил obj/%.o
target в исходном make-файле, это конфликт?
Я провел несколько экспериментов и нашел obj/%.o
цель в исходном make-файле будет вызываться (потому что echo
команда выполнена) и файлы.d будут обновлены при необходимости. Но почему это так? Нам нужна цель в.d файле, чтобы знать зависимость, и почему она не вызывается?
1 ответ
Когда вы настраиваете Makefile, строка, которая является только целью и зависимостями, без каких-либо инструкций после нее, является просто дополнительной зависимостью. Итак, в качестве примера:
a.o: a.cpp
g++ -o $@ -c $+
a.o: a.h b.h
Первая строка говорит, чтобы построить a.o
, это зависит от a.cpp
, а затем инструкции о том, как его построить. Второй a.o
просто добавляет дополнительные зависимости от a.h
а также b.h
, Это в основном то, что делает вышеупомянутый механизм, так как он определяет много дополнительных строк зависимости, но не добавляет никаких инструкций.