GUN make 8 make的隱含規則

2021-10-03 23:21:51 字數 2813 閱讀 1973

隱含規則為make提供了一類目標檔案通用方法,不需要在makefile中明確的給出重建特定目標檔案所需的細節描述。

只要目標檔案中除字尾以外其他部分相同,make都能夠使用若干隱含規則來最終產生這個目標檔案。

對應關係:

exename.o 對應 exename.c

exename  對應 exename.o

1.隱含規則的使用

foo:foo.o 

cc -o foo foo.o $(cflags) $(ldflags)

這裡並沒有給出重建檔案foo.o的規則,在make執行這條規則的時候,無論foo.o存在與否,都會試圖根據隱含規則來重建這個檔案。

可以使用 -r 或者 -r 引數取消隱含規則

2.常用隱含規則

編譯c程式:

n.o 自動由 n.c 生成,執行命令 $(cc) -c $(cppflags) $(cflags)

鏈結單一的object檔案

n 自動由 n.o 生成,執行命令 $(cc) $(ldflags) n.o $(loadlibes) $(ldlibs)

3. 隱含變數

內嵌隱含變數的命令中,所使用的變數都是預定義的變數,我們稱之為隱含變數。

在makefile中,通過命令列引數或者設定系統環境變數來對它進行重定義。

隱含規則中所使用的隱含變數分為兩類:

3.1 代表命令的變數

ar      函式庫打包程式,可以建立靜態庫.a文件,預設是 ar

as      匯程式設計序,預設 as

cc      c編譯程式,預設是cc

cpp    c程式的預處理器,預設是  $(cc) -e

yacc  yacc文法分析器,預設命令是 yacc

rm      刪除命令, 預設是rm -f

3.2 代表引數的變數

arflags  執行ar命令的命令列引數,預設是 rv

asflags  執行彙編語器 as 的命令列引數

cflags    執行cc編譯器的命令列引數

yflags   yacc文法分析器引數

4. make隱含規則鏈

如果乙個目標檔案需要一系列隱含規則才能完成它的建立,則把這個系列稱為乙個 鏈。

中間過程檔案:

檔案n.c不存在也沒有在makefile中提及的情況,只要存在n.y這個檔案,那麼make也會經過這兩個步驟來重建n.o :

n.y -> n.c -> n.o

其中,n.c就在中間過程檔案。並且會自動加入到依賴關係鏈中。

在makefile中明確提及的檔案都不被作為中間過程檔案來處理。

當中間檔案不存在時:

如果make在執行時需要乙個中間過程檔案,那麼預設的動作是:這個中間過程檔案在make執行結束後會被刪除。

5. 模式規則

在模式規則中,目標名中需要包含有模式字元 % ,其可以匹配任何非空字串。

模式字元 % 的匹配和替換發生在規則中所有變數和函式引用展開之後。

普通多目標規則(多目標中沒有模式):

多目標模式規則:

比如有如下 多目標模式 規則:

%.o %.x : %.c

$(cc) $(cflags) $< -o $@

當執行make foo.o foo.c時,會只看到第乙個目標foo.o被建立,同時make會提示foo.x檔案是最新的,其實foo.x並沒有被建立。

6. 自動化變數

自動化變數的取值取決於所執行的規則的目標和依賴的檔名。

有以下自動化變數:

$@  表示規則的檔名

$%   當規則的目標檔案是乙個靜態庫檔案時,代表靜態庫的乙個成員名。如果目標不是靜態庫,其值為空。

$<    規則的第乙個依賴檔名。

$?     所有比目標檔案更新的依賴檔案列表,空格分隔。

$^     規則的所有依賴檔案列表,使用空格分隔。

$+     類似於$^,但是保留了依賴檔案中重複出現的檔案。

$*      在模式規則和靜態模式規則中,代表 莖,莖 是目標模式中 % 所代表的部分。

$(@d)    表示目標檔案的目標部分,不包括斜槓。如果$@是 dir/foo.o 則$(@d) 為 dir

$(@f)    表示目標檔案完整檔名中除目錄以外的部分。如果$@是 dir/foo.o 則$(@f) 為 foo.o

$(*d)

$(*f)      表示目標 莖 中的目錄和檔名部分。

$(%d)

$(%f)    當目標為靜態庫時,表示庫檔案成員中目錄部分和檔名部分。

$($($(^d)

$(^f)      表示規則中所有依賴檔案的目錄部分和檔名部分。

$(+d)

$(+f)     表示規則中所有依賴檔案的目錄部分和檔名部分(可存在重複檔案)。

$(?d)

$(?f)     表示被更新的依賴檔案的目錄部分和檔名部分。

7. 萬用規則

當模式規則的目標只有乙個模式字元 % ,我們稱之為 萬用規則。

使用萬用規則會導致make執行時考慮的情況變多,從而效率降低,所以需要對萬用規則的使用進行限制:

將萬用規則設定為最終規則,定義時使用雙冒號規則。作為最終規則,此規則只有在它的依賴檔案存在時才能被應用。即使它的依賴可以由隱含規則建立也不行。

8.預設規則

在make執行過程中無法為乙個檔案找到合適的重建規則,那麼就用預設規則去建立。

比如:

%::

touch $@

執行make時,對所有不存在的.c檔案將會使用touch命令建立這樣乙個空的原始檔。

GUN make 9 make的靜態庫檔案

靜態庫檔案也稱為 文件檔案,是由一些 o 檔案的集合。在linux中使用工具 ar 對其進行維護管理。1.庫成員作為目標 庫成員作為目標時,使用如下格式 archive member 表示庫archive的成員member。同時指定庫的多個成員 foolib hack.o dge.o 等價於 foo...

8月8日小結

又經歷一次比賽,今天比賽前兩道題都比較簡單,第一題沒有難度,第二題理解起來有些麻煩,看了好一會才搞懂題意,不過被題意帶進坑了去了,題意就是取區間內的數從小到大重新排列,看要求的位置數字有沒有變化,看懂後便直接用sort寫了,測試沒問題,提交就超時,重新優化了幾個地方,依舊是超時,才感覺出來這是個坑。...

日記8月8日

前言 前幾天一直不知道在忙些什麼,反正就是沒有時間寫.正好今天有時間,將以前的感想也補上.我們4個人是提前兩天過來的,回顧下來到北京的這幾天.8月8日 早上8點鐘,火車準時到達北京首都,這個讓我們走進中科軟體學院就一直魂牽夢繞的地方 早就知道大四要去北京實習 走進北京的第乙個感覺就是涼爽,因為前十幾...