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

Makefile变量未按预期复用:执行make first为何输出b?

为什么执行make first会输出"b"?

先看你提供的Makefile代码:

SRC := a

first: $(SRC)
        @echo $(SRC)
        @echo "$@ $"

SRC := b

second: $(SRC)
        @echo $(SRC)
        @echo "$@ $"

执行make first后的结果:

make first
b
first a

原因在于Makefile的两个核心处理阶段:

  1. 读取阶段:make会从头到尾扫描整个Makefile,完成所有变量赋值、规则依赖的解析工作。你用的:=是立即赋值运算符,赋值操作会在读取阶段立刻生效。所以SRC := a先把SRC设为a,随后SRC := b直接覆盖了之前的值,读取阶段结束后,SRC的最终值就是b。
  2. 执行阶段:当make确定要执行first目标时,才会运行目标下的命令。命令行里的$(SRC)是在执行阶段才展开的,自然会使用读取阶段最终确定的SRC值b,这就是第一行输出"b"的原因。

而规则里的依赖$(SRC)是在读取阶段展开的,所以first: $(SRC)在读取阶段就被解析成了first: a,执行命令时$<代表第一个依赖,也就是a,因此第二行输出"first a"。

如果想让first目标单独使用SRC的a值,可以用目标特定变量来实现:

first: SRC := a
first: $(SRC)
        @echo $(SRC)
        @echo "$@ $"

second: SRC := b
second: $(SRC)
        @echo $(SRC)
        @echo "$@ $"

这样执行make first就会输出a和first a了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:08:22