小型項目makefile

目錄結構

hello_world
├──include
├──src
├──bin
├──obj
├──.dep
├──bin_debug
├──obj_debug
├──.dep_debug
└──makefile

這里bin,obj,.dep,bin_debug,obj_debug,.dep_debug都是makefile自動生成的,方便編輯器只創(chuàng)建src和include目錄即可。

區(qū)分release版和debug版

默認創(chuàng)建release版:make
指定debug目標創(chuàng)建debug版:make debug

支持自動生成頭文件依賴

參考鏈接:Auto-Dependency Generation

小心使用make clean

這里make clean將會強制遞歸刪除bin,obj,.dep,bin_debug,obj_debug,.dep_debug目錄。使用前需確保里面沒有需要保留的數據。

makefile

#生成makefile所在的目錄的絕對路徑
#MAKEFILE_LIST是make工具定義的環(huán)境變量,最后一個值就是當前的makefile的啟動路徑(可能是相對路徑)
TOP_DIR := $(patsubst %/, %, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))

#各項目錄
INC_DIR := $(TOP_DIR)/include
SRC_DIR := $(TOP_DIR)/src
BIN_DIR := $(TOP_DIR)/bin
OBJ_DIR := $(TOP_DIR)/obj
DEP_DIR := $(TOP_DIR)/.dep
BIN_DIR_DBG := $(TOP_DIR)/bin_debug
OBJ_DIR_DBG := $(TOP_DIR)/obj_debug
DEP_DIR_DBG := $(TOP_DIR)/.dep_debug

#編譯器,鏈接器
CXX := g++
LD := g++

#生成依賴文件選項
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
DEPFLAGS_DBG = -MT $@ -MMD -MP -MF $(DEP_DIR_DBG)/$*.d

#編譯選項
CXXFLAGS := -std=c++11 -Wall -m64
CXXFLAGS_DBG := -std=c++11 -g -Wall -m64

#宏定義
MACROS :=
MACROS_DBG :=

#鏈接選項
LDFLAGS :=

#包含的頭文件和庫文件
INCS :=-I $(INC_DIR)
LIBS :=

#源文件以及中間目標文件和依賴文件
SRCS := $(notdir $(wildcard $(SRC_DIR)/*.cpp))
OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
DEPS := $(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d, $(SRCS)))
OBJS_DBG := $(addprefix $(OBJ_DIR_DBG)/, $(patsubst %.cpp, %.o, $(SRCS)))
DEPS_DBG := $(addprefix $(DEP_DIR_DBG)/, $(patsubst %.cpp, %.d, $(SRCS)))

#最終目標文件
TARGET := $(BIN_DIR)/hello_world
TARGET_DBG := $(BIN_DIR_DBG)/hello_world

#默認最終目標
.PHONY : all
all : $(TARGET)

#debug最終目標
.PHONY : debug
debug : $(TARGET_DBG)

###################################Release#########################################
#生成最終目標(release版)
$(TARGET) : $(OBJS) | $(BIN_DIR)
    $(LD) $(LDFLAGS) $(LIBS) -o $@ $^

#若沒有bin目錄則自動生成
$(BIN_DIR) :
    mkdir -p $@

#生成中間目標文件(release版)
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
    $(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(MACROS) -o $@ $<

#若沒有obj目錄則自動生成
$(OBJ_DIR) :
    mkdir -p $@

#若沒有.dep目錄則自動生成
$(DEP_DIR) :
    mkdir -p $@

#依賴文件會在生成中間文件的時候自動生成,這里只是為了防止報錯
$(DEPS) :

#引入中間目標文件頭文件依賴關系
include $(wildcard $(DEPS))

###################################Debug#########################################
#生成最終目標(debug版)
$(TARGET_DBG) : $(OBJS_DBG) | $(BIN_DIR_DBG)
    $(LD) $(LDFLAGS) $(LIBS) -o $@ $^

#若沒有bin_debug目錄則自動生成
$(BIN_DIR_DBG) :
    mkdir -p $@

#生成中間目標文件(debug版)
$(OBJ_DIR_DBG)/%.o : $(SRC_DIR)/%.cpp $(DEP_DIR_DBG)/%.d | $(OBJ_DIR_DBG) $(DEP_DIR_DBG)
    $(CXX) -c $(DEPFLAGS_DBG) $(CXXFLAGS_DBG) $(INCS) $(MACROS_DBG) -o $@ $<

#若沒有obj_debug目錄則自動生成
$(OBJ_DIR_DBG) :
    mkdir -p $@

#若沒有.dep_debug目錄則自動生成
$(DEP_DIR_DBG) :
    mkdir -p $@

#依賴文件會在生成中間文件的時候自動生成,這里只是為了防止報錯
$(DEPS_DBG) :

#引入中間目標文件頭文件依賴關系
include $(wildcard $(DEPS_DBG))

#刪除makefile創(chuàng)建的目錄
.PHONY : clean
clean :
    rm -rf $(BIN_DIR) $(OBJ_DIR) $(DEP_DIR) $(BIN_DIR_DBG) $(OBJ_DIR_DBG) $(DEP_DIR_DBG)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容