因爲只是用來編譯簡單的小型程序,因此目錄儘可能簡潔:c++
#. #├── bin #├── .dep #├── makefile #├── obj #└── src
這裏用戶須要建立的就只有src目錄,裏面放入項目.h
和.cpp
文件。工具
利用g++命令中推導頭文件依賴的功能生成每一個.cpp
文件對應的.d
依賴文件,再將.d
依賴文件include
到makefile文件中,實現對依賴頭文件的檢測。
具體原理見:Auto-Dependency Generationspa
生成release版命令:make
生成debug版命令:make debug
要注意的是debug版和release版共享目錄,因此作切換的時候須要先make clean
一下.net
#目錄結構 #. #├── 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)