Нашел решение сам.Трюк также появляется в официальной документации GNU make .
Строка для генерации зависимостей должна выглядеть следующим образом:
.cpp.d:
g++ -MM $< | sed 's!^$(<:.cpp=.o):!$(<:.cpp=.o) $(<:.cpp=.d):!' > $@
sed переводит строку зависимости из"main.o: main.cpp include / hello.hpp" в "main.o main.d: main.cpp include / hello.hpp" (пример из моего свернутого теста), поэтому .d зависит от тех же файлов, что иСам файл .o.
Хотя я лично рекомендую использовать, например, SCons , который способен автоматически отслеживать зависимости, поскольку (по моему опыту) решение GNU часто ломается, когда новый заголовочный файлили некоторые файлы были переименованы.