Makefile使用教程1

NAVYSUMMER發表於2024-05-23

規則(Rules):一個Makefile檔案由一條一條的規則構成,一條規則結構如下

target … (目標): prerequisites …(依賴)
        recipe(方法)
        …
        …

最簡單的Makefile

hello: hello.cpp
    g++ hello.cpp -o hello # 開頭必須為一個Tab,不能為空格

但通常需要將編譯與連結分開寫,分為如下兩步

hello: hello.o
    g++ hello.o -o hello
hello.o: hello.cpp
    g++ -c hello.cpp

Makefile檔案的命名與指定

Make會自動查詢makefile檔案,查詢順序為GNUmakefile -> makefile -> Makefile

GNUmakefile:不建議使用,因為只有GNU make會識別,其他版本的make(如BSD make, Windows nmake等)不會識別,如果只給GNU make使用的情況

makefile:可以使用,GNU make和其他版本make識別

Makefile:最常用,強烈建議使用

如果執行make的時候沒有找到以上名字的檔案,則會報錯,這時候可以手動指定檔名

make -f mkfile  # make -f <filename>
make --file=mkfile # make --file=<filename>
手動指定之後,make就會使用指定的檔案,即使有Makefile或者makefile不會再自動使用

Makefile檔案內容組成

一個Makefile檔案通常由五種型別的內容組成:顯式規則、隱式規則、變數定義、指令和註釋

顯式規則(explicit rules):顯式指明何時以及如何生成或更新目標檔案,顯式規則包括目標、依賴和更新方法三個部分

隱式規則(implicit rules):根據檔案自動推導如何從依賴生成或更新目標檔案。

變數定義(variable definitions):定議變數並指定值,值都是字串,類似C語言中的宏定義(#define),在使用時將值展開到引用位置

指令(directives):在make讀取Makefile的過程中做一些特別的操作,包括:

  1. 讀取(包含)另一個makefile檔案(類似C語言中的#include)

  2. 確定是否使用或略過makefile檔案中的一部分內容(類似C語言中的#if)

  3. 定義多行變數

註釋(comments):一行當中 # 後面的內容都是註釋,不會被make執行。make當中只有單行註釋。如果需要用到#而不是註釋,用\#。

檢視原始檔的依賴檔案

g++ -MM main.cpp

  

相關文章