先看下面的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沒有定義所以什麼都沒有輸出。
b = $(a)時,雖然該語句之前a沒有定義,但是在其後定義了,所以能輸出later。
#example
a = before1
a = before2
b := $(a)
a = later1
all:
@echo $(b)
執行make,輸出before2。
解釋:「:=」向前尋找離它最近的一條定義。
上面makefile最後一句echo前面的@符號的作用是禁止回顯。如我們的makefile改為如下:
#example
a = before1
b = $(a)
b = before2
c = $(b)
a = later1
b = later2
all:
echo $(c)
執行make:
echo later2
later2
分析:c = $(b),應該從makefile檔案最後往前找b,得到b = later2,將最後一句全部變數代替即為:
echo later2,因echo前沒有@符號,回顯該語句,然後再輸出later2。
注意:當我們直接在終端上要用echo輸出某個變數的值時,是不能加()的。如我們要輸出paht
應該用echo $path,而不能用echo $(path),否則會報錯,注意'$'不能少了。
makefile中"?=",含義為:如沒定義,則賦值。
如:temp ?= var 等價於
ifeq($(temp),undefined)
temp = var
endif
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中萬用字元 與 的區別
本文的測試環境是windows7下使用mingw提供的make.exe 例如,如果你想編譯乙個資料夾下的所有.c檔案,你可能會這樣寫 1 o c 2 gcc o 但是如果整個檔案只有這兩行的話,就會出現這樣的錯誤 make target not found.stop.要知道原因,我們先來看看另乙個m...
makefile 與 的區別
1 賦值,這種形式是以遞迴的形式展開變數,及被賦值的變數只有在被引用 使用 時,才會展開,及延遲展開 不常用 2 賦值,這種形式是直接展開式賦值。foo bar bar ugh ugh huh?all echo foo 例子 於gnumake 上述例子執行結果為 其中all echo foo 等價於...