makefile 與 的區別

2021-09-20 06:18:33 字數 1767 閱讀 9178

1、"="賦值,這種形式是以遞迴的形式展開變數,及被賦值的變數只有在被引用(使用)時,才會展開,及延遲展開(不常用)

2、":="賦值,這種形式是直接展開式賦值。

foo = $(bar)

bar = $(ugh)

ugh = huh?

all:;echo $(foo)

例子**於gnumake

上述例子執行結果為(其中all:;echo $(foo)等價於 將分號去掉,echo語句換行並以tab鍵開頭)

echo huh?

huh?

如果將 foo = $(bar)替換成 foo:=$(bar)呢:

foo := $(bar)

bar = $(ugh)

ugh = huh?

all:;echo $(foo)

執行結果如下:

echo
可以看到foo變數為空,這就印證了簡述中的定義,foo直接展開式賦值時,bar變數為空(還未賦值),所以foo也為空,foo遞迴展開賦值時,在呼叫echo 語句時才被展開,所以此時bar的值為hub?,所以foo的值也是hub?

網上有一種說法: "=" make會將整個makefile展開後,再決定變數的值,":="表示變數的值決定於它在makefile中的位置,而不是整個makefile展開式的最終結果

那麼這句話對嗎,我個人認為這種描述是不精確的,會給人帶來誤區,「:=」 和"="的區別還是按照例子1中的測試結果描述,我們將上例做如下新增:

foo := $(bar)

bar = $(ugh)

ugh = huh?

all:

echo $(foo)

foo := hello

如果按照上述網上的說法,那麼你很可能認為 foo仍然為空,但實際執行結果為:

echo hello

hello

實際上一般make執行確定的目標前,會將所有的變數賦值全部讀取,解析,也就是呼叫all目標之前,foo:=hello 已經被讀取了,並且已經生效了,所以,echo $(foo)的結果會是hello,那上述網路描述是什麼意思呢?其實他的本來的意思是,如果乙個變數foo只在乙個地方被賦值的時候 用"="和":="被賦值的區別是,如果賦值的內容中有變數,"="會等makefile全部展開後,所有的變數值再來為foo變數賦值,而":="不會等makefile全部展開,而是foo變數之前所有展開的變數的值來為foo進行賦值,如果foo:=$(bar),其中bar變數在foo變數之前還沒有展開,則bar變數就按空處理,將空賦值為foo。所以上述網路說法可以在這種情況下可以套用。

而我們是在乙個makefile中的多個地方為同一變數賦值,所以會產生歧義,如果makefile中在多個地方對同一變數進行賦值,無論用「=」還是":="都是按照makefile展開的順序,最後為變數賦值的地方是最終生效的賦值語句。

如果將上述例子中所有的 ":=" 變成 "=" 那麼執行結果也是毫無疑義的,如下:

foo = $(bar)

bar = $(ugh)

ugh = huh?

all:

echo $(foo)

foo = hello

執行結果:

echo hello

hello

另外,其實並不推薦 := 和= 在變數賦值中交替混合使用,其實 =並不常用。

Makefile中 與 的區別

先看下面的makefile example b a a later all echo b 執行make命令,我們發現什麼都沒輸出,我們將第2行的 換成 example b a a later all echo b 執行make,輸出later。分析 b a 時,它只會到這句語句之前去找a的值,因a沒...

makefile中「 」與「 」的區別

先看下面的makefile example b a a later all echo b 執行make命令,我們發現什麼都沒輸出,我們將第3行的 換成 example b a a later all echo b 執行make,輸出later。分析 b a 時,它只會到這句語句之前去找a的值,因a沒...

Makefile中萬用字元 與 的區別

本文的測試環境是windows7下使用mingw提供的make.exe 例如,如果你想編譯乙個資料夾下的所有.c檔案,你可能會這樣寫 1 o c 2 gcc o 但是如果整個檔案只有這兩行的話,就會出現這樣的錯誤 make target not found.stop.要知道原因,我們先來看看另乙個m...