我有一组用于构建“大”C 项目的生成文件。我现在正试图在我的 C++ 项目中重用一些,并且遇到了我无法弄清楚的头痛问题。
生成文件看起来像这样
SOURCES = \
elements/blue.cpp
# Dont edit anything below here
VPATH = $(addprefix $(SOURCE_DIR)/, $(dir $(SOURCES)))
CXXFLAGS = $(OPT_FLAGS) -MMD -MF $(BUILD_DIR)/$*.d -D_LINUX -DNDEBUG -pipe
DCXXFLAGS = $(DEBUG_FLAGS) -MMD -MF $(BUILD_DIR)/$*.d -v -D_LINUX -D_DEBUG -pipe
OBJECTS := $(patsubst %.cpp, $(BUILD_DIR)/Release/%.o, $(notdir $(SOURCES)))
DOBJECTS := $(patsubst %.cpp, $(BUILD_DIR)/Debug/%.o, $(notdir $(SOURCES)))
$(OBJECTS): $(BUILD_DIR)/Release/%.o: %.cpp
+@[ -d $(dir $@) ] || mkdir -p $(dir $@)
$(CPP) $(INCLUDE) $(CXXFLAGS) $(DEFINES) -o $@ -c $<
它有点复杂,但它在 C 中所做的是构建 SOURCES 中定义的所有 %.c 文件并将目标文件放在 BUILD_DIR 中。它在 c 中工作得很好,但这不适用于 cpp 文件。我明白了
make: *** No rule to make target `blue.cpp', needed by `build/Release/blue.o'. Stop.
它就像 VPATH 根本不工作。我试过
vpath %.cpp src/elements
但这也不起作用。
令人惊讶的是,将 blue.cpp 重命名为 blue.c 并将 makefile 编辑回 %.c 用法确实有效,它编译得很好。
我在这里疯了吗?