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