本身寫makefile

目錄結構

因爲只是用來編譯簡單的小型程序,因此目錄儘可能簡潔:c++

#.
#├── bin
#├── .dep
#├── makefile
#├── obj
#└── src

這裏用戶須要建立的就只有src目錄,裏面放入項目.h.cpp文件。工具

自動生成頭文件依賴

利用g++命令中推導頭文件依賴的功能生成每一個.cpp文件對應的.d依賴文件,再將.d依賴文件include到makefile文件中,實現對依賴頭文件的檢測。
具體原理見:Auto-Dependency Generationspa

debug和release

生成release版命令:make
生成debug版命令:make debug
要注意的是debug版和release版共享目錄,因此作切換的時候須要先make clean一下.net

makefile

#目錄結構
#.
#├── bin
#├── .dep
#├── makefile
#├── obj
#└── src

#獲取當前的makefile所在的目錄絕對路徑
#MAKEFILE_LIST是make工具定義的環境變量,最後一個值就是當前的makefile的啓動路徑(多是相對路徑)
TOP_DIR := $(patsubst %/, %, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))

#各項目錄
BIN_DIR := $(TOP_DIR)/bin
DEP_DIR := $(TOP_DIR)/.dep
OBJ_DIR := $(TOP_DIR)/obj
SRC_DIR := $(TOP_DIR)/src

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

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

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

#宏定義
MACROS :=

#連接選項
LDFLAGS :=

#包含的頭文件和庫文件
INCS :=
LIBS :=

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

#最終目標文件
TARGET := $(BIN_DIR)/hello

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

#debug最終目標
.PHONY : debug
debug : CXXFLAGS += -g
debug : $(TARGET)

#生成最終目標
$(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))

#刪除makefile建立的目錄
.PHONY : clean
clean :
    rm -rf $(BIN_DIR) $(OBJ_DIR) $(DEP_DIR)
相關文章
相關標籤/搜索