You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将两条相似的Make规则合并为一条通用规则?

合并重复Make规则的两种实用方案

你完全可以把这两条规则合并成一条通用规则,下面是两种简单可行的实现方式:

方案一:利用VPATH指定依赖搜索路径

VPATH是Make的内置变量,用于定义Make查找依赖文件的额外目录。只需将你的源码目录$(SRC)和$(DEMODIR)加入VPATH,就能用一条规则处理所有情况:

# 用冒号分隔多个搜索目录
VPATH := $(SRC):$(DEMODIR)

$(ODIR)/%.o : %.cpp $(DEPS)
    $(CXX) -c -o $@ $< $(CXXFLAGS)

当Make需要生成$(ODIR)/xxx.o时,会自动在VPATH指定的目录中寻找xxx.cpp——不管它在$(SRC)还是$(DEMODIR)下,匹配到对应文件后就执行统一的编译配方。

方案二:静态模式规则配合文件收集

如果你不想依赖VPATH,可以先收集所有需要编译的.cpp文件,再转换为对应的.o目标,用静态模式规则统一处理:

# 收集src和src/demos下的所有.cpp文件
CPP_SOURCES := $(wildcard $(SRC)/*.cpp) $(wildcard $(DEMODIR)/*.cpp)
# 将每个.cpp文件转换为obj目录下的同名.o文件
OBJ_TARGETS := $(patsubst %.cpp, $(ODIR)/$(notdir %.cpp), $(CPP_SOURCES))

# 静态模式规则:为所有目标文件生成编译规则
$(OBJ_TARGETS): $(ODIR)/%.o : %.cpp $(DEPS)
    $(CXX) -c -o $@ $< $(CXXFLAGS)

两种方案都能消除配方重复,后续如果新增其他源码目录,只需更新VPATH或者CPP_SOURCES即可,维护起来更方便。

内容的提问来源于stack exchange,提问作者Catyre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:10:16