變量定義
符號 說明 參考 $() 或
${} 使用變量。如果要使用字符$,需寫爲$$。
SRC = main.c
gcc -c $(SRC) -o main
= 一般變量賦值 := 變量只能使用前面已經定義的變量。
SRC = main.c
OBJ := $(SRC) $(INC) test.c
INC = test1.c
#此時$(OBJ)的值爲main.c test.c
?= 如果變量沒有被定義過,則賦值。否則跳過該語句。
① SRC ?= main.c
#此時$(SRC)的值爲main.c
② SRC = test.c
SRC ?= main.c
#此時$(SRC)的值爲test.c
變量的高級用法
表達 說明 參考 $(var:a=b)
將變量var中所有字符串 a 結尾的替換成字符串 b。
這裏結尾的標誌是 空格 或者 結束符
SRC = test1.c test2.c test3.c
OBJ = $(SRC:.c=.o)
#此時$(OBJ)值爲 test1.o test2.o test3.o
x = y
y = z
a := $($(x))
將變量的值當作變量
x = $(y)
y = z
z = Hello
a := $($(x))
#此時 $(a) 值爲 Hello,一層一層解開即可
Makefile自動化變量
符號 說明 參考 $@
1、規則中的目標文件集合。
2、在模式規則中,如果有多個目標,$@爲目標中模式定義的集合
target : obj
@echo $@ #輸出target
gcc -o target obj
$? 所有比目標新的依賴目標的集合。
#obj1.c被修改
target : obj1 obj2 obj2 obj3
@echo $? #輸出obj1
@echo $^ #輸出obj1 obj2 obj3
@echo $+ #輸出obj1 obj2 obj2 obj3
gcc -o target obj1 obj2 obj3
$^ 所有依賴目標的集合。會自動去除重複的依賴目標。 $+ 所有依賴目標的集合。不會去除重複的依賴目標。
$<
1、規則的第一個依賴文件名。
2、如果是一個目標文件使用隱含規則來重建,則它代表由隱含規則加入的第一個依賴文件。
$%
1、當規則的目標文件是一個靜態庫文件時,代表靜態庫的一個成員名。
2、如果目標不是靜態庫文件,其值爲空。
$ * 在模式規則和靜態模式規則中,代表“莖”。莖”是目標模式中“%”所代表的
部分。