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

Makefile规则中‘%:’的含义及为何不用$@的技术咨询

Makefile 静态模式规则与自动变量疑问解答

文件结构

.
├── dira
│   └── Makefile
├── dirb
│   └── Makefile
└── Makefile

根目录 Makefile

subdir     := $(sort $(subdir) dira dirb)
# $(info $(subdir))
$(subdir): %:
    @echo $*
    @make -s -C $* run

all: $(subdir)
.PHONY: $(subdir) all

dira/Makefile

run:
    @echo "a"

dirb/Makefile

run:
    @echo "b"

1. $(subdir): %: 中 %: 的含义

这是Makefile静态模式规则的简化写法。静态模式规则的完整格式是:

<目标列表>: <目标模式>: <依赖列表>
    <命令>

这里$(subdir)是目标列表(即dira dirb),%:是省略了依赖列表的目标模式写法——表示为目标列表里的每个条目,匹配%对应的内容。

具体来说,%会逐个匹配目标列表中的元素:对dira,%匹配dira;对dirb,%匹配dirb。这种写法的核心作用是批量生成规则,避免为每个子目录单独编写重复的规则代码。

2. 伪目标下为何用$*而非$@?

先明确两个自动变量的定义:

  • $@:代表当前规则的完整目标名
  • $*:代表目标模式中%匹配到的部分

在当前场景下,$@和$*的输出结果完全一致(都是dira或dirb),选择$*是出于以下原因:

  • 语义贴合:这个规则是基于%模式批量生成的,用$*能明确体现“取值来自模式匹配”,而非直接引用目标本身,让代码意图更清晰。
  • 扩展性:如果未来修改目标模式(比如改成dir%),$*会自动适配为a或b,而$@仍会输出完整目标名dira/dirb,此时两者的功能差异就会显现。当前场景下功能等价,但$*更符合静态模式规则的设计逻辑。

内容的提问来源于stack exchange,提问作者Einsam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:40:50