GNU Makefile多子目录C++源文件编译模式规则编写求助
问题根源
你当前的静态模式规则中将所有源文件$(SRC_FILES)设为每个.o目标的依赖,自动变量$<永远会取依赖列表的第一个文件,所以每次只会编译第一个源文件。
解决方案
核心思路是通过VPATH变量指定源文件的搜索路径,让make可以自动从多层子目录中匹配到对应.o的源文件,实现方案如下:
1. 核心修改点
- 新增
VPATH变量,赋值为所有存放源文件的目录列表,make会自动在这些路径下搜索匹配的源文件 - 修正静态模式规则,将依赖改为对应的
.cpp文件 - 新增构建目录自动创建规则,避免第一次编译时目录不存在的报错
- 补充缺失的
OUT变量定义(你原代码中未定义该变量)
2. 修正后完整代码
SRC_DIR=src BUILD_DIR=build OBJ_DIR=$(BUILD_DIR)/obj # 补充定义输出文件路径,可根据需求修改 OUT := $(BUILD_DIR)/game.dll GAME_DIR=$(SRC_DIR)/Game GAME_DIRS=$(GAME_DIR)/Classes $(GAME_DIR)/ConVars $(GAME_DIR)/EventListener $(GAME_DIR)/Functions $(GAME_DIR)/Interfaces $(GAME_DIR)/Modules $(GAME_DIR)/NetVars $(GAME_DIR)/Offsets $(GAME_DIR) # 指定源文件搜索路径 VPATH := $(GAME_DIRS) SRC_FILES=$(foreach dir,$(GAME_DIRS),$(wildcard $(dir)/*.cpp)) OBJ_FILES=$(addprefix $(OBJ_DIR)/,$(notdir $(patsubst %.cpp,%.o,$(SRC_FILES)))) all: $(OUT) $(OUT): $(OBJ_FILES) $(CC) -shared $^ -o $@ -std=c++17 -lgdi32 # 修正静态模式规则,依赖对应cpp,先确保obj目录存在 $(OBJ_DIR)/%.o: %.cpp | $(OBJ_DIR) $(CC) -c $< $(CFLAGS) -o $@ # 自动创建构建目录 $(OBJ_DIR): mkdir -p $@ # 可选:新增清理规则 .PHONY: clean clean: rm -rf $(BUILD_DIR)
注意事项
如果你不同子目录下存在同名的.cpp文件,生成.o时会出现重名覆盖问题,这种场景建议保留子目录结构或者给.o加前缀区分。
内容的提问来源于stack exchange,提问作者Felpsz1
相关产品推荐
相关产品推荐

