首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

通用 Makefile 編寫指南:從入門到專案級應用

     編輯:關於C語言

演進歷程

階段 1:手寫規則(不靈活)

my_app: main.o app1.o app2.o
    gcc -o my_app main.o app1.o app2.o

main.o: main.c
    gcc -c main.c
...

階段 2:變數與模式規則(通用)

SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
CC = gcc
CFLAGS = -g -Wall -O0
INCLUDES = -I/path/include
LIBS = -L/path/lib

TARGET = my_app

$(TARGET): $(OBJS)
    $(CC) $^ -o $@ $(INCLUDES) $(LIBS)

%.o: %.c
    $(CC) -c $< $(CFLAGS)

clean:
    rm -f *.o

.PHONY: clean

關鍵語法解析

語法含義
$(wildcard *.c)展開當前目錄所有 .c 檔案
$(SRCS:.c=.o)替換副檔名 .c → .o
$@目標檔案名(規則冒號左側)
$^所有相依檔案(冒號右側,去重)
$<第一個相依檔案
%.o: %.c模式規則:所有 .o 由同名 .c 編譯
.PHONY: clean宣告偽目標,避免同名檔案干擾

進階技巧

  • 多目錄專案:VPATH = src:include 或遞迴 Make
  • 自動相依生成:gcc -MM -MT $@ -MF $(@:.o=.d) $< 產生 .d 檔,include $(wildcard *.d)
  • 建置模式切換:make DEBUG=1 → CFLAGS += -DDEBUG -O0
  • 並行建置:make -j$(nproc)

常見陷阱

  • Tab vs Space:命令行必須以 Tab 開頭
  • 變數賦值:= (遞迴展開) vs := (立即展開) vs ?= (條件賦值)
  • 路徑含空白需加引號

現代替代方案

CMake、Meson、Bazel 等建置系統提供跨平台、IDE 整合、依賴管理等進階功能,大型專案建議遷移。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved