Проблема в том, что, хотя dirs
поместит исходные файлы в плоский исходный каталог, Make этого не знает. Перед тем, как выполнить правило dirs
, он уже определил, что он не знает способа создания объектных файлов.
Быстрое и грязное решение - сказать Make «поверь мне, все будет хорошо»; Примерное правило объекта:
$(OBJ_DIR)/%.o:
"$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $(OBJ_DIR)/$*.cpp $(CC_INCLUDE_PATH)
Если вы остановитесь на этом, у вас будет рабочее решение.
Если вам нужен более чистый, эффективный и гибкий make-файл, вы должны пересмотреть подход к поиск исходных файлов. Я не вижу веских причин для использования подхода с плоским исходным файлом, но если вы действительно хотите его использовать, вот хороший способ:
vpath %.cpp $(dir $(SRC_FILES))
$(OBJ_DIR)/%.cpp: %.cpp
@cp $< $@
Теперь вы можете избавиться от dir
и использовать свой немодифицированный правило объекта:
$(OBJ_DIR)/%.o: $(OBJ_DIR)/%.cpp
"$(TASKING_CTC_BIN)"/cctc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH)
Как обрабатывать файлы заголовков (FLAT_INC_DIR
) зависит от вас, но я снова рекомендую vpath
.