每次看makefile的時候,總會遇到一些變量記不住,就須要去查找資料,今天有時間,就順便把幾個經常使用的變量學習了下,順便總結了下記憶方法,感受記住它們並不難,特把方法分享給你們。函數
變量定義:學習
$^編譯
全部的依賴目標的集合。以空格分隔。若是在依賴目標中有多個重複的,那個這個變量test
會去除重複的依賴目標,只保留一份。變量
$@gcc
表示規則中的目標文件集。在模式規則中,若是有多個目標,那麼,"$@"就是匹配於打包
目標中模式定義的集合file
$?gc
全部比目標新的依賴目標的集合。以空格分隔。方法
$<
依賴目標中的第一個目標名字。若是依賴目標是以模式(即"%")定義的,那麼"$<"將
是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$(@D)
表示"$@"的目錄部分(不以斜槓做爲結尾) ,若是"$@"值是"dir/foo.o",那麼"$(@D)"就
是"dir",而若是"$@"中沒有包含斜槓的話,其值就是"."(當前目錄) 。
$(@F)
表示"$@"的文件部分,若是"$@"值是"dir/foo.o",那麼"$(@F)"就是"foo.o","$(@F)"相
當於函數"$(notdir $@)"
舉例詳解:
有main.c test.c test1.c test2.c 四個源文件
例子1:
%.o : %.c
gcc -c $< -o $@
把因此的c文件編譯生成對應的o文件,$<表明每次取的c文件,$@表明每次c文件對應的目標文件
例子2:
main : main.o test.o test1.o test2.o
gcc -o $@ $^
把全部的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的集合。
總結:
$^ 全部依賴目標的集合
$? 全部有更新的依賴目標集合
$< 依賴目標中的第一個目標,若是依賴以(%)模式定義,則一個一個取出來的
$@ 目標文件
$(@D) $@的目錄部分
$(@F) $@的文件部分
記憶方法:
dst:source1.o source2.o source3.o source4.o
xx ......
$^ 其中^表示水平的範圍限定,包含全部的依賴文件集合(source1.o source2.o source3.o source4.o )
$? 其中?表示哪些依賴文件有更新是未知的,有更新的依賴文件集合(?)
$< 其中<表示從集合中取值,第一個依賴的文件 (source1.o)
$@ 目標文件 (dst)
$(@D) $@的目錄部分
$(@F) $@的文件部分