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. Затем вы можете предоставить более общие правила для компиляции. Для более подробной информации о том, как использовать это, проверьте эту статью.

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