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

Make 與 Makefile 入門:從手動編譯到自動化構建

編輯:Linux 教學

從 Windows 客戶端開發轉向 Linux,基礎夯實是關鍵。本文記錄 Make/Makefile 學習筆記,幫助理解自動化編譯流程。

程式編譯鏈接四階段

編譯鏈接流程圖

  1. 預編譯(預處理):文本替換,展開宏定義(#define)、包含頭文件(#include)、條件編譯。
  2. 編譯:詞法/語法分析、生成中間代碼。Windows 下為 .obj,Linux 下為 .o 目標文件。
  3. 匯編:將匯編代碼轉為機器指令(0/1 二進制)。
  4. 鏈接:合併目標文件與靜態/動態庫,生成可執行文件。

Make/Makefile 解決什麼問題

大型專案包含成百上千源文件,手動編譯不可行。Makefile 定義構建規則:

  • 指定文件編譯順序與依賴關係
  • 實現增量編譯:僅重新編譯修改過的文件
  • 一鍵構建:執行 make 即可自動完成全流程

make 是解析 Makefile 的命令工具(GNU Make、VS nmake、Delphi make 等);Makefile 是描述構建邏輯的腳本文件,亦可執行系統命令,功能強大。

從 Hello World 到多文件專案

單文件 gcc HelloWorld.c 生成 a.out 簡單直接。但多文件專案(如 add.c/sub.c/mul.c/divi.c/main.c 及對應頭文件)如何高效編譯?

最笨方法:手動逐個編譯鏈接

$ gcc -c add.c -o add.o
$ gcc -c sub.c -o sub.o
$ gcc -c mul.c -o mul.o
$ gcc -c divi.c -o divi.o
$ gcc -c main.c -o main.o
$ gcc -o main add.o sub.o mul.o divi.o main.o

缺點顯而易見:繁瑣、易錯、無增量編譯、依賴關係難維護。

Makefile 初體驗

編寫 Makefile 自動化上述流程:

# 變量定義
CC = gcc
CFLAGS = -Wall -g
OBJS = add.o sub.o mul.o divi.o main.o
TARGET = main

# 默認目標
$(TARGET): $(OBJS)
	$(CC) -o $(TARGET) $(OBJS)

# 模式規則:.c -> .o
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 清理
clean:
	rm -f $(OBJS) $(TARGET)

.PHONY: clean

執行 make 即可自動構建;修改單個 .c 後再次 make 僅重編該文件;make clean 清理產出物。

核心概念速記

  • 目標:要生成的文件(可執行文件、目標文件)
  • 依賴:生成目標所需的源文件/中間文件
  • 命令:構建目標的 Shell 命令(必須以 Tab 開頭)
  • 變量:VAR = value,引用 $(VAR)
  • 自動變量:$@(目標)、$<(第一依賴)、$^(所有依賴)
  • 模式規則:%.o: %.c 批量處理同類文件
  • 偽目標:.PHONY: clean 避免與同名文件衝突

掌握 Makefile,是 Linux C/C++ 開發邁向工程化的第一步。下一階段將深入探討進階用法:多目錄構建、自動依賴生成、交叉編譯配置等。

Copyright © Windows教程網 All Rights Reserved