隱含規則為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點鐘,火車準時到達北京首都,這個讓我們走進中科軟體學院就一直魂牽夢繞的地方 早就知道大四要去北京實習 走進北京的第乙個感覺就是涼爽,因為前十幾...