Makefile中与“=”相关的符号
Makefile 中不同赋值符号(着重介绍 “=” 相关符号)的对比表格:
| 赋值符号 | 行为特性 | 示例 | 扩展时机 | 变量依赖处理方式 |
|---|---|---|---|---|
| = | 递归赋值(延迟扩展) | VAR = $(OTHER) world | 使用变量时进行扩展 | 引用的变量会使用最终的值 |
| := | 简单赋值(立即扩展) | VAR := $(OTHER) world | 定义变量的行被解析时扩展 | 引用的变量使用当前已定义的值 |
| ?= | 条件赋值(仅在变量未定义时生效) | VAR ?= default | 定义变量的行被解析时检查 | 如果变量已定义,则赋值操作被忽略 |
| += | 变量追加(继承原有赋值特性) | VAR += new_value | 取决于原变量的赋值方式 | 会保留原变量的扩展特性 |
核心要点说明
递归赋值(=):
变量的值是在被使用时才会进行计算,而不是在定义的时候。
若引用了尚未定义的变量,不会引发错误,因为真正的扩展是在使用变量时才进行的。
立即赋值(:=):
变量的值在定义时就会被确定下来,后续不会再发生变化。
如果引用了未定义的变量,就会扩展为空值。
条件赋值(?=):
只有当变量未被定义时,赋值操作才会生效。
这一特性可用于提供默认值,同时避免覆盖已有的定义。
变量追加(+=):
会保留原变量的赋值特性(比如递归或立即扩展)。
常用于逐步构建参数列表或者文件列表。
示例对比
下面通过例子直观地展示不同赋值符号的差异:
A = $(B)
B = hello
A += world # 最终 A 的值为 "hello world"
X := $(Y)
Y = goodbye
X += everyone # 最终 X 的值为 " everyone"(因为定义 X 时 Y 还未被定义)
Z ?= initial
Z ?= overwrite # Z 的值依然是 "initial",因为它已经被定义过了

浙公网安备 33010602011771号