Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux Makefile 與 make 命令詳解:自動化構建核心工作流

編輯:Linux 教學

make 是構建自動化的標準工具,Makefile 定義依賴關係與構建規則。本文系統講解 Makefile 結構、核心目標、常用變量、模式規則與進階技巧。

Makefile 核心結構

目標: 依賴1 依賴2 ...
	命令1
	命令2
  • 目標:輸出文件(可執行文件、.o、.ko、.a 等)或虛擬標籤
  • 依賴:源文件、頭文件、其他目標
  • 命令:必須以 Tab 開頭,每行在獨立 Shell 執行

內建變量與隱含規則

隱含規則示例:%.o: %.c 自動編譯 $(CC) $(CFLAGS) -c $< -o $@。

標準構建目標

變量默認值用途
CCccC 編譯器
CXXg++C++ 編譯器
CFLAGS-g -O2C 編譯選項
CXXFLAGS-g -O2C++ 編譯選項
LDFLAGS鏈接選項
ARar靜態庫工具
RMrm -f刪除命令
目標作用
all默認目標,構建所有產物
clean刪除中間文件(.o、.ko、可執行文件)
install安裝至系統目錄(通常 /usr/local/bin)
uninstall移除已安裝文件
dist生成發佈包(PACKAGE-VERSION.tar.gz)
distcheck驗證發佈包可完整構建
distcleanclean + 刪除 configure 生成文件(含 Makefile)

Autotools 整合流程

# 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 並發

內核模組專用 Makefile(補充)


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

常見錯誤避坑

  • 命令行非 Tab:"missing separator" → 替換為 Tab
  • 變量引用未加括號:$VAR 只取首字符 → $(VAR)
  • 遞歸變量無限展開:VAR = $(VAR) x → 改用 :=
  • 通配符在變量定義不展開:SRC = *.c → SRC = $(wildcard *.c)
Copyright © Windows教程網 All Rights Reserved