Makefile 是 Linux/Unix 環境下 C/C++ 專案構建的核心腳本。掌握標準寫法能大幅提升構建效率與可維護性。本文提供一個經典的標準 Makefile 範本,並逐行解析關鍵語法與變數用法。
- # 專案配置區 ---------------------------------------------------
- # 源碼文件
- SRC = ThreadQueue.cpp
- # 目標文件(自動替換副檔名)
- OBJ = $(SRC:.cpp=.o)
- # 最終執行檔名稱
- PROGRAM = ThreadQueue
- # 編譯器選擇
- CC = g++
- # 包含路徑
- INCLUDE = -I/usr/include/ncurses -I/usr/include/
- # 連結器參數(庫)
- LINKPARAM = -lpthread -lncurses
- # 編譯選項:發布版優化 -O,開發版可用 -g -Wall
- # CFLAGS = -ansi -g -Wall
- CFLAGS = -ansi -O -Wall
- # --------------------------------------------------------------
- # 預設目標
- : $(PROGRAM)
- # 連結規則
- $(PROGRAM): $(OBJ)
- $(CC) -o $(PROGRAM) $(LINKPARAM) $(OBJ)
- # 後綴規則:.cpp -> .o
- .SUFFIXES: .cpp
- .cpp.o:
- $(CC) $(INCLUDE) $(CFLAGS) -c $<
- # 清理規則
- clean:
- -rm -f *.o $(PROGRAM)
VAR = value:遞迴展開變數(使用時才展開)。VAR := value:即時展開變數(定義時展開),效能較好。$(VAR) 或 ${VAR}:引用變數。$(SRC:.cpp=.o):替換引用,將變數中所有 .cpp 替換為 .o。$@:目標文件名(冒號左邊)。$<:第一個依賴文件名(冒號右邊第一個)。$^:所有依賴文件名(去重)。$?:比目標新的依賴文件。範本使用傳統後綴規則 .cpp.o:,現代 Make 推薦使用模式規則,更靈活:
- %.o: %.cpp
- $(CC) $(INCLUDE) $(CFLAGS) -c $< -o $@
clean 不產出文件,應宣告為偽目標避免衝突:
- .PHONY: clean
-MMD -MP 旗標讓編譯器產生 .d 文件,include $(wildcard *.d) 自動追蹤頭文件變更。VPATH 或分層 Makefile(遞迴 make)管理子目錄。make BUILD=debug 或環境變數動態調整 CFLAGS。make -j$(nproc) 加速編譯,需確保依賴關係正確。missing separator。$(CC) -o $@ $^ $(LINKPARAM))。pkg-config --cflags --libs libname 獲取編譯/連結旗標。clean 規則前加 - 忽略錯誤(如文件不存在),避免中斷。對於大型專案,建議使用 CMake、Meson 等構建系統生成器,再由其生成 Makefile 或 Ninja 構建檔,享受跨平台、IDE 整合、依賴管理等優勢。
標準 Makefile 掌握「變數、規則、自動變數、模式」四大核心,配合良好的專案結構習慣,即可應對絕大多數中小型 C++ 專案構建需求。本文範本可作為起點,根據專案實際情況擴展。