Makefile有三個很是有用的變量。分別是$@,$^,$

    每次看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)   $@的文件部分

相關文章
相關標籤/搜索