前言:本文簡要介紹Makefile檔案的編寫規範,結合具體專案中的應用進行講解。
具體程式碼地址: https://github.com/AnSwErYWJ/DogFood/blob/master/Makefile
簡介
Make工具最主要也是最基本的功能就是通過makefile檔案來描述源程式之間的相互關係並自動維護編譯工作。而makefile 檔案需要按照某種語法進行編寫,檔案中需要說明如何編譯各個原始檔並連線生成可執行檔案,並要求定義原始檔之間的依賴關係。
make命令的選項與引數
1 2 3 |
-k:發生錯誤時任然繼續執行,而不是在檢測到第一個錯誤時停止。 -n:只輸出要執行的步驟,不真正執行。 -f:告訴make命令哪個檔案作為makefile檔案。如果不存在就查詢makefile檔案,如果還不存在就查詢Makefile。按慣例使用Makefile。 |
語法
makefile檔案由一組依賴關係和規則組成。每個依賴關係由一個目標(即將要建立的檔案)和一組該目標所依賴的原始檔組成。
依賴關係
依賴關係定義了最終應用程式裡的每個檔案與原始檔之間的關係。
1 2 |
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:
1 |
all: a.out b.out |
注意:如果未指定一個all目標,則make命令只建立makefile檔案的第一個目標。
規則
規則定義了目標的建立方式。
注意:規則所在行必須以製表符tab開頭。
下面就是一個簡單的例子:
1 2 3 4 |
a.out: main.o gcc main.o main.o: main.c main.h gcc -c main.c |
make命令會自行判斷檔案的正確順序,並使用給出的規則建立相應的檔案,並在螢幕顯示出來。如果多次編譯,則make命令會讀取makefile檔案來確定重建目標的最少命令,而不會重複編譯。
註釋
makefile檔案的註釋以#開頭,到一行的結束。
巨集
makefile檔案中也可以定義巨集,也可以用make命令時在命令列定義,如果需要使用檔案外部定義,最好不要用空格。
1 2 3 4 5 6 7 8 9 |
#巨集定義 SRC = example.c OBJS = example.o CC = gcc CFALGS = -o #巨集引用 test: sqlite3.o $(OBJS) $(CC) $(CFALGS) test sqlite3.o $(OBJS) -ldl -lpthread |
內建巨集:
1 2 3 4 5 6 |
$?:當前目標所依賴的檔案列表中比當前目標檔案還要新的檔案 $@:當前目標的名字 $:當前依賴檔案的名字 $*:不包括字尾名的當前依賴檔案的名字 -:使make忽略錯誤 @:執行時不將該條命令顯示在標準輸出 |
應用
下面放一個我寫的Makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式