makefile =和:=的区别
makefile =和:=的区别
- “=”
“=”是最普通的等号,然而在Makefile中确实最容易搞错的赋值等号,使用”=”进行赋值,变量的值是整个makefile中最后被指定的值。不太容易理解,举个例子如下:
VIR_A = A
VIR_B = $(VIR_A) B
VIR_A = AA
最终VIR_B的值是AAB,因为=是所有展开最后的结果,没有先后顺序
,
- “:=”
相比于前面“最普通”的”=”,”:=”就容易理解多了。”:=”就表示直接赋值,赋予当前位置的值。同样举个例子说明
VIR_A := A
VIR_B := $(VIR_A) B
VIR_A := AA
:=是立即赋值,所以VIR_B等于AB,VIR_A这个时候还不等于AA
抱歉,我之前的回答确实说反了。在 Makefile
中,=
和 :=
确实有不同的行为,这里是正确的解释:
-
=
(延迟扩展赋值):
使用=
进行赋值时,变量的值会在使用时进行扩展。这意味着在定义变量时,它不会立即计算变量值中的变量引用,而是将这些变量引用保留到实际使用变量时才进行替换。variable = $(value)
如果
value
变量在定义variable
时尚未定义,$(value)
将保持为一个待扩展的变量,直到它被实际使用时才会进行替换。 -
:=
(即时扩展赋值):
使用:=
进行赋值时,变量的值会在赋值时立即进行扩展。这意味着在定义变量时,它将立即计算变量值中的变量引用,并替换为相应的值。variable := $(value)
如果
value
变量在定义variable
时尚未定义,$(value)
将被替换为一个空字符串,而不是保留为一个待扩展的变量。
AI回答:
以下是一个示例来说明两者的区别:
# 假设 VALUE 未定义
VAR1 = $(VALUE)
VAR2 := $(VALUE)
# 稍后定义 VALUE
VALUE = somevalue
all:
# 输出 VAR1 和 VAR2 的值
@echo VAR1 is $(VAR1)
@echo VAR2 is $(VAR2)
在这个例子中,VAR1
将被赋值为空字符串,因为 $(VALUE)
在定义 VAR1
时未定义。而 VAR2
将在定义时立即扩展,所以它也将被赋值为空字符串。当 VALUE
被定义为 somevalue
后,VAR1
保持为空字符串,而 VAR2
将变为 somevalue
。因此,all
目标的输出将是:
VAR1 is
VAR2 is somevalue