Makefile: зависимость без правила не делает родитель недействительным
Вот упрощенная версия моего Makefile:
all: myprogram
myprogram: main.o
c++ main.o -o myprogram
main.o: main.cpp mylib.hpp
c++ -c main.cpp
mylib.hpp: mylib.inl
Все эти файлы, упомянутые выше, являются реальными файлами. Когда я меняюсь mylib.hpp
, main.cpp
перекомпилирует. Однако моя проблема в том, что когда я меняю mylib.inl
, main.cpp не перекомпилируется. Как я могу сделать недействительным main.o
цель и, следовательно, myprogram
цель, когда я редактирую mylib.inl
? Я бы предпочел не использовать .PHONY
цель, потому что я не хочу перекомпилировать все каждый раз, только когда я редактирую mylib.inl
,
1 ответ
Ваша проблема в том, что зависимость описана в вашем make-файле:
mylib.hpp: mylib.inl
не описывает реальную зависимость. изменения mylib.inl
не меняется mylib.hpp
(нет правила инициировать такое изменение).
Если mylib.inl
входит из mylib.hpp
тогда это на самом деле должно быть зависимость от main.o
скорее, чем mylib.hpp
, что приводит к такой зависимости:
main.o: main.cpp mylib.hpp mylib.inl
Поддержание отдельных зависимостей вручную может быть подвержено ошибкам, поэтому большинство компиляторов предоставляют функции, которые могут автоматически создавать файлы зависимостей, которые вы можете включить из файла make. Затем вы можете предоставить более общие правила для компиляции. Для более подробной информации о том, как использовать это, проверьте эту статью.