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

Другие вопросы по тегам