makefile =和:=的区别

makefile =和:=的区别

  1. “=”
    “=”是最普通的等号,然而在Makefile中确实最容易搞错的赋值等号,使用”=”进行赋值,变量的值是整个makefile中最后被指定的值。不太容易理解,举个例子如下:
VIR_A = A
VIR_B = $(VIR_A) B
VIR_A = AA

最终VIR_B的值是AAB,因为=是所有展开最后的结果,没有先后顺序,

  1. “:=”
    相比于前面“最普通”的”=”,”:=”就容易理解多了。”:=”就表示直接赋值,赋予当前位置的值。同样举个例子说明
VIR_A := A
VIR_B := $(VIR_A) B
VIR_A := AA

:=是立即赋值,所以VIR_B等于AB,VIR_A这个时候还不等于AA

抱歉,我之前的回答确实说反了。在 Makefile 中,=:= 确实有不同的行为,这里是正确的解释:

  1. =(延迟扩展赋值):
    使用 = 进行赋值时,变量的值会在使用时进行扩展。这意味着在定义变量时,它不会立即计算变量值中的变量引用,而是将这些变量引用保留到实际使用变量时才进行替换。

    variable = $(value)
    

    如果 value 变量在定义 variable 时尚未定义,$(value) 将保持为一个待扩展的变量,直到它被实际使用时才会进行替换。

  2. :=(即时扩展赋值):
    使用 := 进行赋值时,变量的值会在赋值时立即进行扩展。这意味着在定义变量时,它将立即计算变量值中的变量引用,并替换为相应的值。

    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
posted @ 2024-03-15 11:44  学不会xuebuhui  阅读(218)  评论(0编辑  收藏  举报
Language: javascript