Makefile學習(一)

青絲入流年12345發表於2020-09-28

Makefile學習(一)

一、makefile書寫規則

targets : prerequisites

    command

相關說明如下:

targets:規則的目標,可以是 Object File(一般稱它為中間檔案),也可以是可執行檔案,還可以是一個標籤;

prerequisites:是我們的依賴檔案,要生成 targets 需要的檔案或者是目標。可以是多個,也可以是沒有;

command:make 需要執行的命令(任意的 shell 命令)。可以有多條命令,每一條命令佔一行。
命令的開始一定要使用Tab鍵。[^1]

二、makefile工作流程

在我們編譯專案檔案的時候,預設情況下,make 執行的是 Makefile 中的第一規則(Makefile 中出現的第一個依賴關係),此規則的第一目標稱之為“最終目標”或者是“終極目標”。

三、makefile中萬用字元和自動化變數

萬用字元:

萬用字元使用說明
*匹配0個或者是任意個字元
匹配任意一個字元
[]$1

自動化變數:

自動化變數說明
$@表示規則的目標檔名
$%當目標檔案是一個靜態庫檔案時,代表靜態庫的一個成員名
$<規則的第一個依賴的檔名
$?所有比目標檔案更新的依賴檔案列表,空格分隔
$^代表的是所有依賴檔案列表,使用空格分隔
$+類似“$^”,但是它保留了依賴檔案中重複出現的檔案。主要用在程式連結時庫的交叉引用場合
$*模式規則和靜態模式規則中,代表“莖”

四、makefile變數的定義與賦值

  OBJ=main.o test.o test1.o test2.o
  test:$(OBJ)    
  gcc -o test $(OBJ)

變數的名稱可以由大小寫字母、阿拉伯數字和下劃線構成。

  1. 簡單賦值 ( := ) 程式語言中常規理解的賦值方式,只對當前語句的變數有效。
  2. 遞迴賦值 ( = ) 賦值語句可能影響多個變數,所有目標變數相關的其他變數都受影響。
  3. 條件賦值 ( ?= ) 如果變數未定義,則使用符號中的值定義變數。如果該變數已經賦值,則該賦值語句無效。
  4. 追加賦值 ( += ) 原變數用空格隔開的方式追加一個新值。

五、makefile路徑

VPATH:變數,更具體的說是環境變數,Makefile 中的一種特殊變數,使用時需要指定檔案的路徑。
vpath:關鍵字,按照模式搜尋,也可以說成是選擇搜尋。搜尋的時候不僅需要加上檔案的路徑,還需要加上相應限制的條件。

VPATH=src car
test:test.o    
gcc -o $@ $^
vpath test.c src : car
test:test.o 
gcc -o $@ $^

六、makefile偽目標

使用偽目標有兩點原因:
1、避免我們的 Makefile 中定義的只執行的命令的目標和工作目錄下的實際檔案出現名字衝突。
2、提高執行 make 時的效率,特別是對於一個大型的工程來說,提高編譯的效率也是我們所必需的。
先宣告偽目標,再定義:

.PHONY:clean
clean:   	
	 rm -rf *.o test

相關文章