You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:31:08