之前我們學(xué)習(xí)了 makefile 中的變量及函數(shù)的相關(guān)語法知識,那么我們今天就來以實(shí)際需求為例來進(jìn)行實(shí)際編寫。實(shí)戰(zhàn)需求:1、自動生成 target 文件夾存放可執(zhí)行文件;2、自動生成 objs 文件夾存放編譯生成的目標(biāo)文件(*.o);3、支持調(diào)試版本的編譯選項(xiàng);4、考慮代碼的擴(kuò)展性。
成都創(chuàng)新互聯(lián)公司長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為濮陽企業(yè)提供專業(yè)的做網(wǎng)站、成都做網(wǎng)站,濮陽網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
那么在進(jìn)行今天的 makefile 編寫之前,我們還需要了解下幾個(gè)知識點(diǎn):a> $(wildcard _pattern),它的作用是獲取當(dāng)前工作目錄中滿足 _pattern 的文件或目錄列表;b> $(addprefix _prefix,_names),它的作用是給名字列表 _names 中的每一個(gè)名字增加前綴 _prefix。
其中的關(guān)鍵技巧:1、自動獲取當(dāng)前目錄下的源文件列表(函數(shù)調(diào)用):SRCS := $(wildcard *.c);2、根據(jù)源文件列表生成目標(biāo)文件列表(變量的值替換):OBJS := $(SRCS:.c=.o);3、對每一個(gè)目標(biāo)列表加上路徑前綴(函數(shù)調(diào)用):OBJS := $(addprefix path/, $(OBJS))。
我們來看看規(guī)則中的模式替換(目錄結(jié)構(gòu)),如下
看看編譯規(guī)則的依賴,如下
下來我們來看看具體的 makefile 是怎樣編寫的,還是以之前的那三個(gè) .c 文件為源文件。
CC := gcc MKDIR := mkdir RM := rm -rf DIR_OBJS := objs DIR_TARGET := target DIRS := $(DIR_OBJS) $(DIR_TARGET) TARGET := $(DIR_TARGET)/hello-makefile.out # main.c func.c const.c SRCS := $(wildcard *.c) # main.o func.o const.o OBJS := $(SRCS:.c=.o) # objs/main.o objs/func.o objs/const.o OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)) .PHONY : rebuild clean all $(TARGET) : $(DIRS) $(OBJS) $(CC) -o $@ $(OBJS) @echo "Target File ==> $@" $(DIRS) : $(MKDIR) $@ $(DIR_OBJS)/%.o : %.c ifeq ($(DEBUG),true) $(CC) -o $@ -g -c $^ else $(CC) -o $@ -c $^ endif rebuild : clean all all : $(TARGET) clean : $(RM) $(DIRS)
我們來看看編譯效果
我們看到已經(jīng)正確執(zhí)行了,在當(dāng)前目錄下自動生成兩個(gè)文件夾 objs target。在 objs 文件夾里生成三個(gè) .o 文件,在 target 文件夾中生成 hello-makefile.out 文件,執(zhí)行這個(gè)可執(zhí)行文件,結(jié)果也是我們之前定義的。下來我們來看看能不能定義 DEBUG 版的程序,這時(shí)便要用到一個(gè)命令了 objdump -S target,它用于來查看程序是否為調(diào)試版。下來我們來看看結(jié)果,圖 a 為普通版的,圖 b 為 DEBUG 版的
圖 a 普通版
圖 b DEBUG 版
我們看到 DEBUG 版本相對于普通版來說,多了一些東西,比如我們在里面寫的 printf 語句,而且多了函數(shù)調(diào)用的語句。普通版則是只執(zhí)行程序就 OK 了。通過今天的綜合示例的編寫,總結(jié)如下:1、目錄是可以成為目標(biāo)的依賴的,在規(guī)則中創(chuàng)建目錄;2、預(yù)定義函數(shù)是 makefile實(shí)戰(zhàn)時(shí)不可或缺的部分;3、規(guī)則中的模式匹配可以直接針對目錄中的文件;4、可以使用命令行變量編譯特殊的目標(biāo)版本。
歡迎大家一起來學(xué)習(xí) makefile 語言,可以加我QQ:243343083。