Makefile檔案編寫 六 自動變數

2021-10-21 17:40:36 字數 2343 閱讀 9341

參考:makefile教程:makefile檔案編寫1天入門

關於自動化變數可以理解為由 makefile 自動產生的變數。在模式規則中,規則的目標和依賴的檔名代表了一類的檔案。規則的命令是對所有這一類檔案的描述。我們在 makefile 中描述規則時,依賴檔案和目標檔案是變動的,顯然在命令中不能出現具體的檔名稱,否則模式規則將失去意義。

那麼模式規則命令中該如何表示檔案呢?就需要使用「自動化變數」,自動化變數的取值根據執行的規則來決定,取決於執行規則的目標檔案和依賴檔案。下面是對所有的自動化變數進行的說明:

自動化變數

說明$@

表示規則的目標檔名。如果目標是乙個文件檔案(linux 中,一般成 .a 檔案為文件檔案,也成為靜態的庫檔案),那麼它代表這個文件的檔名。在多目標模式規則中,它代表的是觸發規則被執行的檔名。

$%當目標檔案是乙個靜態庫檔案時,代表靜態庫的乙個成員名。例如,如果乙個目標是"foo.a(bar.o)",那麼,"$%「就是"bar.o」,"$@「就是"foo.a」。如果目標不是函式庫檔案(unix下是[.a],windows下是[.lib]),那麼,其值為空。

$<

規則的第乙個依賴的檔名。如果是乙個目標檔案使用隱含的規則來重建,則它代表由隱含規則加入的第乙個依賴檔案。

$?所有比目標檔案更新的依賴檔案列表,空格分隔。如果目標檔案時靜態庫檔案,代表的是庫檔案(.o 檔案)。

$^代表的是所有依賴檔案列表,使用空格分隔。如果目標是靜態庫檔案,它所代表的只能是所有的庫成員(.o 檔案)名。乙個檔案可重複的出現在目標的依賴中,變數「$^」只記錄它的第一次引用的情況。就是說變數「$^」會去掉重複的依賴檔案。

$+類似「$^」,但是它保留了依賴檔案中重複出現的檔案。主要用在程式鏈結時庫的交叉引用場合。

$*這個變數表示目標模式中"%「及其之前的部分。如果目標是"dir/a.foo.b」,並且目標的模式是"a.%.b",那麼,"$*「的值就是"dir/a.foo」。這個變數對於構造有關聯的檔名是比較有較。如果目標中沒有模式的定義,那麼"$*「也就不能被推導出,但是,如果目標檔案的字尾是make所識別的,那麼」$*「就是除了字尾的那一部分。例如:如果目標是"foo.c」,因為".c"是make所能識別的字尾名,所以,"$*「的值就是"foo」。這個特性是gnu make的,很有可能不相容於其它版本的make,所以,你應該盡量避免使用"$*",除非是在隱含規則或是靜態模式中。如果目標中的字尾是make所不能識別的,那麼"$*"就是空值

下面我們就自動化變數的使用舉幾個例子。

例項1:

test:test.o test1.o test2.o

gcc -o $@ $^

test.o:test.c test.h

gcc -o $@ $<

test1.o:test1.c test1.h

gcc -o $@ $<

test2.o:test2.c test2.h

gcc -o $@ $<

這個規則模式中用到了 「$@」 、"$

例項2:

lib:test.o test1.o test2.o

ar r $?

假如我們要做乙個庫檔案,庫檔案的製作依賴於這三個檔案。當修改了其中的某個依賴檔案,在命令列執行 make 命令,庫檔案 「lib」 就會自動更新。"$?" 表示修改的檔案。

gnu make 中在這些變數中加入字元 「d」 或者 「f」 就形成了一系列變種的自動化變數,這些自動化變數可以對檔案的名稱進行操作。

下面是一些詳細的描述:

變數名功能$(@d)

表示檔案的目錄部分(不包括斜槓)。如果 「$@」 表示的是 「dir/foo.o」 那麼 「$(@d)」 表示的值就是 「dir」。如果 「$@」 不存在斜槓(檔案在當前目錄下),其值就是 「.」。

$(@f)

表示的是檔案除目錄外的部分(實際的檔名)。如果 「$@」 表示的是 「dir/foo.o」,那麼 「$@f」 表示的值為 「foo.o」。

$(*d)

$(*f)

分別代表 「莖」 中的目錄部分和檔名部分

$(%d)

$(%f)

當以 「archive(member)」 形式靜態庫為目標時,分別表示庫檔案成員 「member」 名中的目錄部分和檔名部分。踏進對這種新型時的目標有效。

$(表示第乙個依賴檔案的目錄部分和檔名部分。

$(^d)

$(^f)

分別表示所有依賴檔案的目錄部分和檔案部分。

$(+d)

$(+f)

分別表示所有的依賴檔案的目錄部分和檔案部分。

$(?d)

$(?f)

分別表示更新的依賴檔案的目錄部分和檔名部分。

makefile檔案編寫

hello.c include include function.h int main function.c includeint fun1 int fun2 int fun3 function.h ifndef fun h define fun h int fun1 void int fun2 v...

Makefile檔案編寫

1 基本大全教程 2 四個賦值的區別 是最基本的賦值 是覆蓋之前的值 是如果沒有被賦值過就賦予等號後面的值 是新增等號後面的值其中 和 的區別是 立馬賦值,是整個makefile檔案讀取完後賦值。1 make會將整個makefile展開後,再決定變數的值。也就是說,變數的值將會是整個makefile...

Makefile檔案編寫

main3.c 1 include 2 include static lib.h 3 include fun.h 4 5int main void static lib.h和 1 extern int add int a,int b 2 extern int sub int a,int b 3 ex...