Makefile 由一組依賴關係與構建規則組成,是自動化編譯的核心配置文件。其基本格式為:
目標: 依賴文件列表
編譯命令
以下範例展示一個典型的多文件專案構建流程:
myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
gcc -c main.c
2.o: 2.c a.h b.h
gcc -c 2.c
3.o: 3.c b.h c.h
gcc -c 3.c
執行 make 時,它會根據時間戳判斷哪些目標需要重建,僅編譯變更過的文件,大幅提升構建效率。
| 參數 | 說明 |
|---|---|
-k | 遇到錯誤繼續編譯其他目標 |
-n | 僅輸出將執行的命令,不實際執行(乾跑模式) |
-f | 指定 Makefile 文件名(預設為 Makefile 或 makefile) |
使用 # 開頭表示註釋。巨集定義語法為 MACRONAME=value,引用方式為 $(MACRONAME) 或 ${MACRONAME}。
$? — 當前目標中比目標更新的依賴文件列表$@ — 當前目標名稱$< — 第一個依賴文件名稱$* — 不含副檔名的第一個依賴文件名稱建議在 Makefile 開頭定義 all 為預設目標:
all: myapp
長命令跨行使用反斜線 \ 續行。兩個關鍵前綴符號:
- — 忽略該命令的錯誤返回碼@ — 抑制命令本身的輸出(常搭配 echo 使用)Shell 命令間若有順序依賴,使用 && 連接。
Make 內建了常見編譯規則(如 .c.o),可透過模式規則自定義:
%.cpp: %.o
$(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
$(AR) $(ARFLAGS) $@ $<
mylib.a:
(cd mylibdirectory; $(MAKE))
# 或
mylib.a: mydir/2.o mydir/3.o
ar -rv mylib.a $?
使用 GCC 選項自動產生頭文件依賴:
gcc -MM main.c 2.c 3.c
輸出可直接包含於 Makefile 中,確保頭文件變更觸發重編譯。