Makefile中使用变量进行字符串替换失效问题求助
解决Makefile中变量替换目标路径根目录的问题
这个问题我之前踩过坑!核心原因是Makefile的**替换引用(substitution reference)**语法默认不会自动展开你传入的变量参数——也就是说$(OUTPUT)/%在这里会被当成字面字符串去匹配,而不是先展开成output/%,自然匹配不上output/a.txt,所以就原样输出了。
给你两种靠谱的解决办法:
方法一:使用patsubst函数(推荐)
patsubst是Makefile专门用来做模式替换的函数,它会正常展开所有变量参数,写法非常直观:
OUTPUT = output PATH = $(OUTPUT)/a.txt # 示例目标 $(PATH): @echo "移除根目录后的路径:$(patsubst $(OUTPUT)/%,%,$@)"
执行make output/a.txt,就能得到预期的a.txt。
方法二:开启二次展开(适合复杂场景)
如果你一定要用替换引用的语法,可以通过.SECONDEXPANSION:开启二次展开机制,让Makefile先展开替换规则里的变量。注意这里要把变量写成$$(OUTPUT),因为第一次展开会把$$转成单个$,第二次展开时才会解析成$(OUTPUT)的实际值:
OUTPUT = output PATH = $(OUTPUT)/a.txt # 开启二次展开 .SECONDEXPANSION: $(PATH): @echo "移除根目录后的路径:$(@:$$(OUTPUT)/%=%)"
两种方法都能解决你的问题,个人更推荐第一种,代码可读性更高,也不需要额外的配置。
内容的提问来源于stack exchange,提问作者user3240484
相关产品推荐
相关产品推荐

