У меня есть make-файл, и фрагмент выглядит так (файлы и цели переименованы для ясности):
target1 : OtherLib.o MyProg.h MyProg.cpp
g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o
Когда я запускаю 'make target1', я хочу, чтобы make проверил, что MyProg.h и MyProg.cpp обновлены, и запустим target1, если нет. Тем не менее, я получаю сообщение об ошибке
make: *** No rule to make target `MyProg.cpp', needed by `target1'. Stop.
Но «MyProg.cpp» - это то, что я пытаюсь скомпилировать! Итак, я сделал для нее пустую цель, например:
MyProg.h :
MyProg.cpp :
target1 : OtherLib.o MyProg.h MyProg.cpp
g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o
Это работает, но кажется странным. У меня сложилось впечатление, что если я сделаю это просто:
target1 : OtherLib.o
g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o
тогда MyProg будет скомпилирован независимо от того, обновлен он или нет, потому что MyProg.cpp не указан в качестве зависимости. Как правильно сделать это, чтобы make скомпилировал MyProg.o, только если MyProg.cpp и MyProg.h не обновлены?