make 是構建自動化的標準工具,Makefile 定義依賴關係與構建規則。本文系統講解 Makefile 結構、核心目標、常用變量、模式規則與進階技巧。
目標: 依賴1 依賴2 ...
命令1
命令2
| 變量 | 默認值 | 用途 |
|---|---|---|
| CC | cc | C 編譯器 |
| CXX | g++ | C++ 編譯器 |
| CFLAGS | -g -O2 | C 編譯選項 |
| CXXFLAGS | -g -O2 | C++ 編譯選項 |
| LDFLAGS | 鏈接選項 | |
| AR | ar | 靜態庫工具 |
| RM | rm -f | 刪除命令 |
| 目標 | 作用 |
|---|---|
all | 默認目標,構建所有產物 |
clean | 刪除中間文件(.o、.ko、可執行文件) |
install | 安裝至系統目錄(通常 /usr/local/bin) |
uninstall | 移除已安裝文件 |
dist | 生成發佈包(PACKAGE-VERSION.tar.gz) |
distcheck | 驗證發佈包可完整構建 |
distclean | clean + 刪除 configure 生成文件(含 Makefile) |
# 1. 編寫 configure.ac / Makefile.am
# 2. 生成配置腳本
autoreconf -i
# 3. 配置(指定安裝前綴等)
./configure --prefix=/usr/local
# 4. 構建
make
# 5. 安裝
make install
# 6. 生成發佈包
make dist
make distcheck # 自動解包、配置、構建、測試
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
DEPS = $(OBJS:.o=.d)
-include $(DEPS)
%.o: %.c
$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
-MMD -MP 自動生成 .d 依賴文件,頭文件變更自動觸發重編譯。
ifeq ($(OS),Windows_NT)
LDFLAGS += -lws2_32
else
LDFLAGS += -lpthread
endif
make -j$(nproc) # 利用所有 CPU 核心
make -j4 # 限制 4 並發
obj-m += mydriver.o
mydriver-objs := file1.o file2.o
KDIR := /lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
$VAR 只取首字符 → $(VAR)VAR = $(VAR) x → 改用 :=SRC = *.c → SRC = $(wildcard *.c)