Makefile中$(src:%.c=%.o)保留.s文件的原因及解决方法
问题解答
为什么替换后仍保留src/p1.s?
Makefile里的$(src:%.c=%.o)是模式替换,规则很明确:只对变量列表中匹配%.c模式的元素做替换,不匹配的元素会原封不动留在结果里。
你的src变量包含src/p1.c和src/p1.s两个文件:
src/p1.c符合%.c的匹配规则,被替换成src/p1.osrc/p1.s不匹配该模式,所以直接保留,最终输出就同时有两个文件。
如何仅获取src/p1.o文件?
核心思路是先过滤出变量里所有的.c文件,再做替换,常用两种写法:
写法1:拆分过滤+模式替换
src = src/p1.c src/p1.s # 先筛选出所有.c文件 C_FILES = $(filter %.c,$(src)) # 再对筛选结果做替换 STRIPPED_FILE = $(C_FILES:%.c=%.o) all: @echo $(STRIPPED_FILE)
写法2:用patsubst组合过滤
patsubst是更通用的替换函数,和模式替换效果一致,写法更紧凑:
src = src/p1.c src/p1.s STRIPPED_FILE = $(patsubst %.c,%.o,$(filter %.c,$(src))) all: @echo $(STRIPPED_FILE)
执行后输出就是src/p1.o,只会保留替换后的目标文件。
内容的提问来源于stack exchange,提问作者Eranna Yadav
相关产品推荐
相关产品推荐

