Make addprefix中$(x)/*,.c*参数解析疑问
问题解析:Makefile中addprefix与wildcard的执行逻辑
先明确核心误解:你搞反了addprefix的参数顺序!
addprefix的语法是$(addprefix 前缀, 名称列表),作用是把前缀加到每个名称的前面,而非给名称添加后缀。
现在一步步拆解你的代码执行流程:
- 已知
SRC_PATH := src,所以循环变量$(x)展开为src,$(x)/*就是src/*。 - 你的
addprefix $(x)/*.c*实际对应addprefix src/*,.c*——第一个参数是src/*,第二个参数是.c*。 addprefix执行后,会把前缀src/*拼到.c*前面,得到src/*.c*。- 接下来
wildcard处理src/*.c*:这个通配符会匹配src目录下文件名包含.c的所有文件。你的目录里只有file.c符合条件(file.h文件名里没有.c),所以最终展开结果就是src/file.c。
如果你的目标是给src/*匹配到的文件都加上.c后缀,那写法完全错误,应该先让wildcard展开src/*,再用addsuffix(注意是添加后缀的addsuffix,而非addprefix)来实现:
SRC := $(foreach x, $(SRC_PATH), $(addsuffix .c, $(wildcard $(x)/*)))
不过这样会得到src/file.c.c和src/file.h.c,和你最初的直觉结果一致,但这通常不是实际需求——一般我们是要筛选目录下的.c源文件,正确写法应该直接用wildcard src/*.c。
内容的提问来源于stack exchange,提问作者spaesani
相关产品推荐
相关产品推荐

