У людей часто есть такие правила для генерации зависимости, но они действительно не нужны.
При первом создании проекта не требуется никаких зависимостей, поскольку он все равно создает все источники. Только последующие сборки требуют, чтобы зависимости от предыдущей сборки определяли, что нужно перестраивать.
Следовательно, зависимости действительно являются побочным продуктом компиляции. Ваши правила должны выглядеть следующим образом:
#CoreObj1.cpp(and .h)
#CoreObj2.cpp(and .h)
#This is the makefile.
CORE_COMPONENT_OBJECTS = \
obj/CoreObj1.o \
obj/CoreObj2.o \
# Objects
obj/%.o: %.cpp
@mkdir -p obj
$(CXX) $(CXX_CFLAGS) -c -o $@ -MD -MP -MF ${@:.o=.d} $<
DEPS = $(CORE_COMPONENT_OBJECTS:.o=.d)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif
Как примечание стороны, mkdir -p
не является параллельным, сделайте дружелюбным. Например, когда два или более процессов стремятся создать /a/b/c/
и /a/b/cc/
, когда /a/b/
не существует, один процесс mkdir
может завершиться с ошибкой EEXIST
, пытаясь создать /a/b/
.