求助:Makefile中模式规则无法匹配目标问题
问题解决:GNU Make多
%模式规则不匹配的原因及修复 问题根源
你编写的模式规则$(OUT_FLD)/%/.wit_%包含两个%通配符,但GNU Make的普通模式规则(非静态模式)仅支持单个%。多个%会被Make识别为字面量字符,而非匹配相同文本的通配符,因此无法匹配out/target/.wit_target这个目标。
修复方案
方案1:使用静态模式规则
静态模式规则支持在模式中使用多个%,只要所有%匹配相同的文本即可。修改后的Makefile如下:
OUT_FLD = out # 明确指定要匹配的目标列表 TARGETS := $(OUT_FLD)/target/.wit_target target: $(TARGETS) # 静态模式规则:针对TARGETS列表中的目标应用模式 $(TARGETS): $(OUT_FLD)/%/.wit_%: @echo "Creating target: $*" @mkdir -p $(@D) # 先创建目标所在目录 @touch $@ .PHONY: target
方案2:调整规则结构,使用单一%
如果不想用静态模式,可以重构目标路径,让规则只用一个%:
OUT_FLD = out target: $(OUT_FLD)/target/.wit_target # 用%匹配完整的子路径+目标名部分 $(OUT_FLD)/%: @TARGET_NAME=$(notdir $(basename $*)) @echo "Creating target: $$TARGET_NAME" @mkdir -p $(@D) @touch $@
不过这种写法需要额外处理目标名称,不如静态模式直观。
验证
运行make -f makefiles/test.mk target,会看到输出Creating target: target,同时生成out/target/.wit_target文件。
内容的提问来源于stack exchange,提问作者Antonio Sesto
相关产品推荐
相关产品推荐

