1. 程式人生 > >makefile下$^,[email protected],$?,$<,$(@D),$(@F)定義使用詳解

makefile下$^,[email protected],$?,$<,$(@D),$(@F)定義使用詳解

    每次看makefile的時候,總會遇到一些變數記不住,就需要去查詢資料,今天有時間,就順便把幾個常用的變數學習了下,順便總結了下記憶方法,感覺記住它們並不難,特把方法分享給大家。

變數定義:

$^

所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那個這個變數

會去除重複的依賴目標,只保留一份。

[email protected]

表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,"[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

[email protected])"

舉例詳解:

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]的檔案部分

記憶方法:

dstsource1.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]的檔案部分

相關推薦

no