makefile =和:=的區別

学不会xuebuhui發表於2024-03-15

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

相關文章