淺談Linux下Makefile的編寫
前言:本文簡要介紹Makefile檔案的編寫規範,結合具體項目中的應用進行講解。
具體代碼位址: https://github.com/AnSwErYWJ/DogFood/blob/master/Makefile
簡介
Make工具最主要也是最基本的功能就是通過makefile檔案來描述源程式之間的互相關系并自動維護編譯工作。而makefile 檔案需要按照某種文法進行編寫,檔案中需要說明如何編譯各個源檔案并連接配接生成可執行檔案,并要求定義源檔案之間的依賴關系。
make指令的選項與參數
-k:發生錯誤時任然繼續執行,而不是在檢測到第一個錯誤時停止。
-n:隻輸出要執行的步驟,不真正執行。
-f <filename>:告訴make指令哪個檔案作為makefile檔案。如果不存在就查找makefile檔案,如果還不存在就查找Makefile。按慣例使用Makefile。
文法
makefile檔案由一組依賴關系和規則組成。每個依賴關系由一個目标(即将要建立的檔案)和一組該目标所依賴的源檔案組成。
依賴關系
依賴關系定義了最終應用程式裡的每個檔案與源檔案之間的關系。
a.out: main.o
main.o: main.c main.h
上面兩行就是依賴關系:目标a.out:依賴于main.o,目标main.o依賴于main.c和main.h。是以,如果main.c和main.h發生更改,則需要重新編譯整個程式。
如果需要一次建立多個目标檔案,則使用為目标all:
注意:如果未指定一個all目标,則make指令隻建立makefile檔案的第一個目标。
規則
規則定義了目标的建立方式。
注意:規則所在行必須以制表符tab開頭。
下面就是一個簡單的例子:
a.out: main.o
gcc main.o
main.o: main.c main.h
gcc -c main.c
make指令會自行判斷檔案的正确順序,并使用給出的規則建立相應的檔案,并在螢幕顯示出來。如果多次編譯,則make指令會讀取makefile檔案來确定重建目标的最少指令,而不會重複編譯。
注釋
makefile檔案的注釋以#開頭,到一行的結束。
宏
makefile檔案中也可以定義宏,也可以用make指令時在指令行定義,如果需要使用檔案外部定義,最好不要用空格。
#宏定義
SRC = example.c
OBJS = example.o
CC = gcc
CFALGS = -o
#宏引用
test: sqlite3.o $(OBJS)
$(CC) $(CFALGS) test sqlite3.o $(OBJS) -ldl -lpthread
内置宏:
$?:目前目标所依賴的檔案清單中比目前目标檔案還要新的檔案
$@:目前目标的名字
$<:目前依賴檔案的名字
$*:不包括字尾名的目前依賴檔案的名字
-:使make忽略錯誤
@:執行時不将該條指令顯示在标準輸出
應用
下面放一個一個我寫的Makefile
SRC = example.c
OBJS = example.o
CC = gcc
test: sqlite3.o $(OBJS)
$(CC) -o test sqlite3.o $(OBJS) -ldl -lpthread
sqlite3.o: sqlite3.c sqlite3.h
$(CC) -c sqlite3.c -o sqlite3.o
example1.o: $(SRC) sqlite3.h
$(CC) -c $(SRC) -o example1.o
clean:
-rm -f *.o test
回報與建議
- 微網誌:@AnSwEr不是答案
- github:AnSwErYWJ
- 部落格:AnSwEr不是答案的專欄