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

如何在Makefile中仅定义一次字符串替换规则并复用至多个目标?

简化Makefile中重复的路径替换规则

问题

我希望维护一组可复用的前置依赖列表,但当前的Makefile需要在变量赋值和目标规则中重复编写$(objdir)/$(variantN)/%.o这类字符串替换逻辑。想知道能不能只定义一次这类替换规则,以及正确的实现方式。

当前使用的Makefile代码:

variant1 := X
variant2 := Y
objdir := obj
src := a/some.c b/other.c
obj_v1 := $(src:%.c=$(objdir)/$(variant1)/%.o)
obj_v2 := $(src:%.c=$(objdir)/$(variant2)/%.o)
all: $(obj_v1) $(obj_v2)
$(obj_v1): $(objdir)/$(variant1)/%.o: %.c
        @echo v1 $< $(@D)/ $@
$(obj_v2): $(objdir)/$(variant2)/%.o: %.c
        @echo v2 $< $(@D)/ $@

可行的实现方式

方法1:用宏定义复用转换逻辑

通过define创建通用宏,一次性生成每个变体的目标文件列表和编译规则,后续新增变体只需调用宏即可:

variant1 := X
variant2 := Y
objdir := obj
src := a/some.c b/other.c

# 定义通用的变体配置宏,参数1是变体标识(如v1),参数2是变体值(如X)
define setup_variant
obj_$(1) := $$(src:%.c=$(objdir)/$(2)/%.o)
all: $$(obj_$(1))
$$(obj_$(1)): $(objdir)/$(2)/%.o: %.c
	@echo $(1) $$< $$(@D)/ $$@
endef

# 为每个变体实例化配置
$(eval $(call setup_variant,v1,$(variant1)))
$(eval $(call setup_variant,v2,$(variant2)))

方法2:通用模式规则+自动变量

如果不需要单独维护每个变体的目标文件列表,可以直接用通用模式规则配合自动变量简化:

variant1 := X
variant2 := Y
objdir := obj
src := a/some.c b/other.c

# 一次性生成所有变体的目标文件
all: $(foreach var,$(variant1) $(variant2),$(src:%.c=$(objdir)/$(var)/%.o))

# 通用规则匹配所有变体的目标文件
$(objdir)/%/%.o: %.c
	@echo $(notdir $(dir $@)) $< $(@D)/ $@

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:24:54