You need to enable JavaScript to run this app. GNU Makefile多子目录C++源文件编译模式规则编写求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 21:51:02