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 цель в .d файлы включены в make-файл, но на самом деле я уже определил obj/%.o цель в исходном make-файле, это конфликт?

Я провел несколько экспериментов и нашел obj/%.o цель в исходном make-файле будет вызываться (потому что echo команда выполнена) и файлы .d будут обновлены при необходимости. Но почему это так? Нам нужна цель в файле .d, чтобы узнать зависимость, и почему она не вызывается?

2

Решение

Когда вы настраиваете Makefile, строка, которая является только целью и зависимостями, без каких-либо инструкций после нее, является просто дополнительной зависимостью. Итак, в качестве примера:

a.o: a.cpp
g++ -o $@ -c $+

a.o: a.h b.h

Первая строка говорит, чтобы построить a.o, это зависит от a.cpp, а затем инструкции о том, как его построить. Второй a.o просто добавляет дополнительные зависимости от a.h а также b.h, Это в основном то, что делает вышеупомянутый механизм, так как он определяет много дополнительных строк зависимости, но не добавляет никаких инструкций.

2

Другие решения


По вопросам рекламы [email protected]