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

通用 Makefile 模板:基於 gcc -MM 自動推導頭文件依賴,支持 Debug/Release 雙模式構建

     編輯:C++ 入門

特性概覽

  • 自動依賴推導:利用 gcc -MM 生成 .d 文件,精確追蹤 .c/.cpp 對頭文件的依賴,修改頭文件自動觸發相關源文件重編譯。
  • 雙模式構建:DEBUG=YES 時啟用 -g -O0 -Wall -pg 等調試標誌,輸出至 bin/debug/、obj/debug/;否則 Release 模式 -O3,輸出至 bin/release/。
  • 目錄結構約定:
project/
├── src/        # 源文件 (.c, .cpp)
├── inc/        # 頭文件 (可選,已包含在 INC_PATH)
├── obj/debug|release/  # 中間 .o 文件
├── dep/        # 依賴 .d 文件
├── bin/debug|release/  # 最終可執行文件
└── lib/        # 靜態庫

核心變量與規則

# 編譯器
CC  = gcc
CXX = g++
LD  = g++
AR  = ar rc

# 路徑
HOME_PATH   = $(realpath .)
SOURCE_PATH = $(HOME_PATH)/src
INC_PATH    = -I$(HOME_PATH)/src
DEP_PATH    = $(HOME_PATH)/dep
LIB_PATH    = -L$(HOME_PATH)/lib

# 源文件自動收集
SRCS = $(wildcard $(SOURCE_PATH)/*.c) $(wildcard $(SOURCE_PATH)/*.cpp)

# 目標文件與依賴文件映射
OBJS = $(patsubst %, $(OBJ_PATH)/%.o, $(basename $(notdir $(SRCS))))
DEPS = $(patsubst %, $(DEP_PATH)/%.d, $(basename $(notdir $(SRCS))))

# 編譯標誌
DEBUG_CFLAGS   = -g -O0 -Wall -Wconversion -Wuninitialized -D_DEBUG -m64 -pg
RELEASE_CFLAGS = -O3 -m64
# ... CXXFLAGS, LDFLAGS 同理

# 連接庫
LIBS = -Wl,-dn -lev -Wl,-dn -lglog -Wl,-dn -lpthread

依賴生成規則(關鍵)

$(DEP_PATH)/%.d : $(SOURCE_PATH)/%.c
	@set -e; \
	rm -f $@; \
	$(CC) -MM $(CFLAGS) $(INC_PATH) $< > $@.tmp; \
	sed 's,\($*\)\.o[ :]*,$(OBJ_PATH)/\1.o $@ : ,g' < $@.tmp > $@; \
	rm -f $@.tmp

$(DEP_PATH)/%.d : $(SOURCE_PATH)/%.cpp
	@set -e; \
	rm -f $@; \
	$(CC) -MM $(CFLAGS) $(INC_PATH) $< > $@.tmp; \
	sed 's,\($*\)\.o[ :]*,$(OBJ_PATH)/\1.o $@ : ,g' < $@.tmp > $@; \
	rm -f $@.tmp

-include $(DEPS)

sed 將 gcc -MM 輸出的 foo.o: foo.c bar.h 重寫為 obj/debug/foo.o dep/foo.d: foo.c bar.h,確保 .d 文件本身也納入依賴鏈。

編譯規則

$(OBJ_PATH)/%.o : $(SOURCE_PATH)/%.c
	$(CC) -c $(CFLAGS) $(INC_PATH) $< -o $(OBJ_PATH)/$(basename $(notdir $@)).o

$(OBJ_PATH)/%.o : $(SOURCE_PATH)/%.cpp
	$(CXX) -c $(CXXFLAGS) $(INC_PATH) $< -o $(OBJ_PATH)/$(basename $(notdir $@)).o

使用方法

  1. 將 Makefile 放在項目根目錄。
  2. 源碼置於 src/,頭文件可置於 src/ 或 inc/(需補充 INC_PATH)。
  3. make DEBUG=YES 構建調試版;make 構建發布版。
  4. make clean 清理所有中間產物。

遷移提示

  • 若使用 CMake/Meson 等現代構建系統,建議遷移;本 Makefile 適合中小型純 C/C++ 項目快速落地。
  • Windows 下需 MSYS2/MinGW 環境支持 mkdir -p、sed 等命令。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved