此文編寫主要參考韋東山老師教程和《跟我一起寫makefile》和正點原子教程
makefile中的變數可以看成有3種變數,即時變數、延時變數、自動化變數,並且為了簡化程式也引入了模式規則,下面就對這些變數和模式規則做簡單介紹。1、即時變數:
a := *** # a的值即刻確定,在定義時即確定,其中#為注釋。
對於即時變數使用「:=」表示,它的值在定義的時候已經被確定了
2、延時變數
b = *** # b的值使用到時才確定
對於延時變數使用「=」表示。它只有在使用到的時候才確定,在定義/等於時並沒有確定下來。
使用變數的時候使用「$」來引用,如果不想看到命令,可以在命令的前面加上"@"符號,就不會顯示命令本身。當我們執行make命令的時候,make這個指令本身,會把整個makefile讀進去,進行全部分析,然後解析裡面的變數。常用的變數的定義如下:
:= # 即時變數
= # 延時變數
?= # 延時變數, 如果是第1次定義才起效, 如果在前面該變數已定義則忽略這句
+= #追加, 它是即時變數還是延時變數取決於前面的定義
?=:如果這個變數在前面已經被定義了,這句話就不會起效果
(1)makefile 的變數也就是乙個字串,理解成 c語言中的巨集可能會更好。
object=main.o a.o
object+=b.o#追加
test:$(object)
gcc -o test
$(object)
main.o:main.c
gcc -c main.c -o main.o
a.o:a.c
gcc -c a.c -o a.o
b.o:b.c
gcc -c b.c -o b.o
clean:
rm *.o test
分析:當使用變數後**就變得清晰多了,而且易於維護和修改,就如同c語言中的巨集定義一樣,如果有新的.o檔案加入,只需要修改一下object檔案就可以了。
(2)對常用變數的理解
a :=
$(c)
b =$(c)
c = abc
#d = 100ask
d ?= weidongshan
all:
@echo a =
$(a)
@echo b =
$(b)
@echo d =
$(d)
c += 123
執行:
make
結果:a =
b = abc 123
d = weidongshan
分析:d ?= weidongshan: d變數在前面沒有定義,所以d的值為weidongshan,如果在前面新增d = 100ask,最後d的值為100ask。
我們還可以通過命令列存入變數的值 例如:
執行:make d=123456
裡面的d ?= weidongshan這句話就不起作用了。
結果:a =
解析:
(1)模式規則
我們可以使用模式規則來定義乙個隱含規則。乙個模式規則就好像乙個一般的規則,只是在規則中,目標的定義需要有「%」字元。「%」的意思是表示乙個或多個任意字元。在依賴目標中同樣可以使用「%」,只是依賴目標中的「%」的取值,取決於其目標。模式規則中,至少在規則的目標定義中要包含「%」,否則,就是一般的規則。
(2)模式規則中,目標和依賴都是一系列的檔案,每一次對模式規則進行解析的時候都會是不同的目標和依賴檔案,而命令只有一行,如何通過一行命令來從不同的依賴檔案中生成對應的目標?自動化變數就是完成這個功能的!所謂自動化變數就是這種變數會把模式中所
定義的一系列的檔案自動的挨個取出,直至所有的符合模式的檔案都取完,自動化變數只應該出現在規則的命令中,常用的自動化變數如下表所示:
Makefile中的變數和shell變數
我們在寫makefile時 多多少少會用到shell指令碼,對於變數的在shell中的使用有一些要注意的細節。讓我們從乙個簡單的makefile來看看。注意makefile中一定要有乙個目標,且一定要有乙個終極目標,若想要有多個目標應該設立乙個偽目標。如下 all hello hello2 hell...
Makefile中的變數
makefile中的變數 2010年03月25日 b makefile b b 中的變數 b b b b b b 在makefile中,變數就是乙個名字 像是c語言中的巨集 代表乙個文字字串 變數的值 在makefile的目標 依賴 命令中引用乙個變數的地方,變數會被它的值所取代 與c語言中巨集引用...
make和Makefile中的規則和變數
make機制的執行環境需要乙個命令列程式make和乙個文字檔案makefile。make命令執行後有3個退出碼 make的使用格式是 make options target options為make工具的引數選項,target為makefile中指定的目標。make 工具的引數選項 選項含義 f f...