一个通用的makefile写法,自动推导文件的依赖关系
????假設(shè)有兩個頭文件目錄 header1,header2;兩個cpp文件目錄,src1,src2,一個lib目錄
?寫一個完整的makefile步驟如下:
1 定義可執(zhí)行文件的名稱
?TARGET =MyPro???????????????
2 指定此編譯工程所要使用的頭文件所在的目錄
?INC = -I. -Iheader1 -Iheader2
3 指定cpp文件所在的目錄
?VPATH = .:src1:src2
4 指定所有的cpp文件
? ?SRC_PATH = $(foreachdir,$(subst :, ,$(VPATH)),$(wildcard $(dir)/,*.cpp))
?解釋:
?foreach,subst,wildcard為makefile的內(nèi)置函數(shù),其中wildcard函數(shù)為字符串連接函數(shù),把函數(shù)中的兩個參數(shù)連接成一個。subst是字符串替換函數(shù),在此句中意思是把VPATH變量中的冒號替換成空格。foreach函數(shù),就是把subst函數(shù)的返回值,以空格為分隔符,循環(huán)取值賦給dir,然后接受wildcard的處理。
?這句的總體意思是:從VPATH中獲取每個目錄,并分別找出此目錄下所有的cpp文件,賦給SRC_PATH變量。
5 定義中間object文件存放的目錄。
?OBJ_DIR = ./obj
6 所有的object文件要按照和源代碼對應(yīng)的目錄存放,定義object文件的目錄
?OBJ_PATH = $(addprefix?$(OBJ_DIR)/,?? $(subst :,,$(VPATH) )? )
?解釋:
?addprefix函數(shù)是加前綴的函數(shù),詞句中是給VPATH中所有已經(jīng)定義的目錄加上./obj/的前綴。
7 定義連接成目標(biāo)文件所需要的所有的object文件的名稱
?OBJS = $(addprefix $(OBJ_DIR),$(subst.cpp,.o,$(SRC_PATH)))
8 創(chuàng)建一個object文件的目錄
?MAKE_OBJECT_DIR := $(shell mkdir -p $(OBJ_DIR)$(OBJ_PATH))
?
?
*************************?
9 定義實(shí)用的編譯器
?CXX = g++
?CXXFLAGS = -g
10 定義目標(biāo)文件的生成規(guī)則
?$(TARGET) : $(OBJS)
??$(CXX) -o $@ $(OBJS) $(INC)$(CXXFLAGS)
11 定義object文件的生成方式:
?$(OBJ_DIR)/%.o : %.cpp%.cpp.d
??$(CXX) -o $@ -c$< $(INC) $(CXXFLAGS)
12 定義.cpp.d文件的生成方式
?DEPS = $(OBJS:.o=.cpp.d)
?$(DEPS) : $(OBJ_DIR)/%.cpp.d : %.cpp
??$(CXX) $< -MM$(INC) > $(OBJ_DIR)/$<.d
13 定義清理函數(shù)
?clean:
??? @rm -rf./obj
??? @rm -rf$(TARGET)
???至此,一個通用的makefile完成了,如果增加源代碼目錄和頭文件目錄,只需要在INC變量和VPATH變量處加上此目錄即可。中間object文件和文件的依賴關(guān)系自動生成。
總結(jié)
以上是生活随笔為你收集整理的一个通用的makefile写法,自动推导文件的依赖关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小赢卡贷逾期一天的后果
- 下一篇: AMD迎接变革:加速OpenCL的未来