Makefile檔案編寫 八 隱含規則

2021-10-21 18:26:40 字數 2021 閱讀 1338

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

makefile 的隱含規則,所謂的隱含規則就是不需要我們做出具體的操作,由系統自動完成。編寫 makefile 的時候,可以使用隱含規則來簡化makefile 檔案編寫。

例項:

test:test.o

gcc -o test test.o

test.o:test.c

我們可以在 makefile 中這樣寫來編譯 test.c 原始檔,相比較之前少寫了重建 test.o 的命令。但是執行 make,發現依然重建了 test 和 test.o 檔案,執行結果卻沒有改變。這其實就是隱含規則的作用。在某些時候其實不需要給出重建目標檔案的命令,有的甚至可以不需要給出規則。例項:

test:test.o

gcc -o test test.o

執行的結果是相同的。

注意:隱含條件只能省略中間目標檔案重建的命令和規則,但是最終目標的命令和規則不能省略。

隱含規則的具體的工作流程:make 執行過程中找到的隱含規則,提供了此目標的基本依賴關係。確定目標的依賴檔案和重建目標需要使用的命令列。隱含規則所提供的依賴檔案只是乙個基本的(在c語言中,通常他們之間的對應關係是:test.o 對應的是 test.c 檔案)。當需要增加這個檔案的依賴檔案的時候要在 makefile 中使用沒有命令列的規則給出。例項:

test:test.o

gcc -o test test.o

test:test1.h

其實在有些時候隱含規則的使用會出現問題。因為有乙個 make 的「隱含規則庫」。庫中的每一條隱含規則都有相應的優先順序順序,優先順序也就會越高,使用時也就會被優先使用。

例如在 makefile 中新增這行**:

foo.o:foo.p
我們都知道 .p 檔案是 pascal 程式的原始檔,如果書寫規則時不加入命令的話,那麼 make 會按照隱含的規則來重建目標檔案 foo.o。如果當前目錄下恰好存在 foo.c 檔案的時候,隱含規則會把 foo.c 當做是 foo.o 的依賴檔案進行目標檔案的重建。因為編譯 .c 檔案的隱含規則在編譯 .p 檔案之前,顯然優先順序也會越高。當 make 找到生成 foo.o 的檔案之後,就不會再去尋找下一條規則。如果我們不想使用隱含規則,在使用的時候不僅要宣告規則,也要新增上執行的命令。

這裡講的是預先設定的隱含規則。如果不明確的寫下規則,那麼make 就會自己尋找所需要的規則和命令。當然我們也可以使用 make 選項:-r或-n-builtin-rules選項來取消所有的預設值的隱含規則。當然即使是指定了「-r」的引數,某些隱含規則還是會生效。因為有很多的隱含規則都是使用了字尾名的規則來定義的,所以只要隱含規則中含有「字尾列表」那麼隱含規則就會生效。預設的列表是:

.out、.a、.in、.o、.c、.cc、.c、.p、.f、.f、.r、.y、.l、.s、.s、.mod、.sym、.def、

.h、.info、.dvi、.tex、.texinfo、.texi、.txinfo、.w、.ch、.web、.sh、.elc、.el。

下面是一些常用的隱含規則:

上面的編譯順序都是一些常用的程式語言執行隱含規則的順序,我們在 makefile 中指定規則時,可以參考這樣的列表。當需要編譯原始檔的時候,考慮是不是需要使用隱含規則。如果不需要,就要把相應的規則和命令全部書寫上去。

內嵌隱含規則的命令中,所使用的變數都是預定義的。我們將這些變數稱為「隱含變數」。這些變數允許修改:可以通過命令列引數傳遞或者是設定系統環境變數的方式都可以對它進行重新定義。無論使用哪種方式,只要 make 在執行的,這些變數的定義有效。makefile 的隱含規則都會使用到這些變數。

比如我們編譯 .c 檔案在我們的 makefile 中就是隱含的規則,預設使用到的編譯命令時cc,執行的命令時cc -c我們可以對用上面的任何一種方式將cc定義為ncc。這樣我們就編譯 .c 檔案的時候就可以用ncc進行編譯。

隱含規則中使用的變數可以分成兩類:

下面我們來列舉一下代表命令的變數,預設都是小寫。

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...