makefile下$^,[email protected],$?,$<,$(@D),$(@F)定義使用詳解
每次看makefile的時候,總會遇到一些變數記不住,就需要去查詢資料,今天有時間,就順便把幾個常用的變數學習了下,順便總結了下記憶方法,感覺記住它們並不難,特把方法分享給大家。
變數定義:
$^
所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那個這個變數
會去除重複的依賴目標,只保留一份。
表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,"[email protected]"就是匹配於
目標中模式定義的集合
$?
所有比目標新的依賴目標的集合。以空格分隔。
$<
依賴目標中的第一個目標名字。如果依賴目標是以模式(即"%")定義的,那麼
是符合模式的一系列的檔案集。注意,其是一個一個取出來的。
$(@D)
表示"[email protected]"的目錄部分(不以斜槓作為結尾) ,如果"[email protected]"值是"dir/foo.o",那麼"$(@D)"就
是"dir",而如果"[email protected]"中沒有包含斜槓的話,其值就是"."(當前目錄) 。
$(@F)
表示"[email protected]"的檔案部分,如果"[email protected]"值是"dir/foo.o",那麼"$(@F)"就是"foo.o","$(@F)"相
當於函式"$(notdir
舉例詳解:
有main.c test.c test1.c test2.c 四個原始檔
例子1:
%.o : %.c
gcc -c $< -o [email protected]
把所以的c檔案編譯生成對應的o檔案,$<代表每次取的c檔案,[email protected]代表每次c檔案對應的目標檔案
例子2:
main : main.o test.o test1.o test2.o
gcc -o [email protected] $^
把所有的o檔案編譯生成可執行的main檔案,$^代表所以的依賴檔案集合(main.o test.o test1.o test2.o),@代表目標檔案(main)
例子3:
lib : test.o test1.o test2.o
ar r lib $?
把有更新的依賴檔案重新打包到庫lib中, 如果只有test1.o更新,則$?代表test1.o, 如果test.o test1.o都有更新,則$?代表test.o test1.o的集合。
總結:
$^ 所有依賴目標的集合
$? 所有有更新的依賴目標集合
$< 依賴目標中的第一個目標,如果依賴以(%)模式定義,則一個一個取出來的
[email protected] 目標檔案
$(@D) [email protected]的目錄部分
$(@F) [email protected]的檔案部分
記憶方法:
dst:source1.o source2.o source3.o source4.o
xx ......
$^ 其中^表示水平的範圍限定,包含所有的依賴檔案集合(source1.o source2.o source3.o source4.o )
$? 其中?表示哪些依賴檔案有更新是未知的,有更新的依賴檔案集合(?)
$< 其中<表示從集合中取值,第一個依賴的檔案 (source1.o)
[email protected] 目標檔案 (dst)
$(@D) [email protected]的目錄部分
$(@F) [email protected]的檔案部分