如何结合文件列表使用Makefile模式规则?
解决Makefile模式规则无法匹配目标的问题
你的问题出在没有正确使用静态模式规则来关联FILES变量中的元素和对应的.c目标。原来的写法$(FILES).c:只是简单把变量展开成多个目标,但没有告诉Make如何将每个目标和命令中的文件名前缀关联起来,而且$(FILE)是未定义的变量,导致Make无法识别对应规则。
正确的实现方式
使用静态模式规则可以完美解决这个需求,它能针对指定的目标集应用模式匹配,同时复用你的FILES变量:
FILES := a b c d # 静态模式规则:针对$(FILES)对应的.c文件 $(FILES:=.c): %.c: run build $*
关键说明
$(FILES:=.c):这是Make的变量替换语法,会把FILES里的每个元素(a、b、c、d)都加上.c后缀,生成目标列表a.c b.c c.c d.c。%.c::这是模式匹配部分,%会匹配每个目标去掉.c后的前缀(比如a.c匹配%为a)。$*:这个自动变量会获取%匹配到的前缀内容,也就是FILES里的原始元素,刚好替代你原来想用的$(FILE)。
验证效果
现在执行make a.c,Make会正确找到规则并执行:
run build a
这种写法既不需要逐个定义.c目标,又能确保只针对FILES中的元素生成对应规则,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

