溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

變量與函數(shù)的綜合示例(九)

發(fā)布時(shí)間:2020-07-20 06:33:02 來(lái)源:網(wǎng)絡(luò) 閱讀:433 作者:上帝之子521 欄目:系統(tǒng)運(yùn)維

        之前我們學(xué)習(xí)了 makefile 中的變量及函數(shù)的相關(guān)語(yǔ)法知識(shí),那么我們今天就來(lái)以實(shí)際需求為例來(lái)進(jìn)行實(shí)際編寫(xiě)。實(shí)戰(zhàn)需求:1、自動(dòng)生成 target 文件夾存放可執(zhí)行文件;2、自動(dòng)生成 objs 文件夾存放編譯生成的目標(biāo)文件(*.o);3、支持調(diào)試版本的編譯選項(xiàng);4、考慮代碼的擴(kuò)展性。

        那么在進(jìn)行今天的 makefile 編寫(xiě)之前,我們還需要了解下幾個(gè)知識(shí)點(diǎn):a> $(wildcard _pattern),它的作用是獲取當(dāng)前工作目錄中滿足 _pattern 的文件或目錄列表;b> $(addprefix _prefix,_names),它的作用是給名字列表 _names 中的每一個(gè)名字增加前綴 _prefix。

        其中的關(guān)鍵技巧:1、自動(dòng)獲取當(dāng)前目錄下的源文件列表(函數(shù)調(diào)用):SRCS := $(wildcard *.c);2、根據(jù)源文件列表生成目標(biāo)文件列表(變量的值替換):OBJS := $(SRCS:.c=.o);3、對(duì)每一個(gè)目標(biāo)列表加上路徑前綴(函數(shù)調(diào)用):OBJS := $(addprefix path/, $(OBJS))。

        我們來(lái)看看規(guī)則中的模式替換(目錄結(jié)構(gòu)),如下

變量與函數(shù)的綜合示例(九)

        看看編譯規(guī)則的依賴(lài),如下

變量與函數(shù)的綜合示例(九)

        下來(lái)我們來(lái)看看具體的 makefile 是怎樣編寫(xiě)的,還是以之前的那三個(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)

        我們來(lái)看看編譯效果

變量與函數(shù)的綜合示例(九)

        我們看到已經(jīng)正確執(zhí)行了,在當(dāng)前目錄下自動(dòng)生成兩個(gè)文件夾 objs  target。在 objs 文件夾里生成三個(gè) .o 文件,在 target 文件夾中生成 hello-makefile.out 文件,執(zhí)行這個(gè)可執(zhí)行文件,結(jié)果也是我們之前定義的。下來(lái)我們來(lái)看看能不能定義 DEBUG 版的程序,這時(shí)便要用到一個(gè)命令了 objdump -S target,它用于來(lái)查看程序是否為調(diào)試版。下來(lái)我們來(lái)看看結(jié)果,圖 a 為普通版的,圖 b 為 DEBUG 版的

變量與函數(shù)的綜合示例(九)

                                                                       圖 a 普通版

變量與函數(shù)的綜合示例(九)

                                                                    圖 b DEBUG 版

        我們看到 DEBUG 版本相對(duì)于普通版來(lái)說(shuō),多了一些東西,比如我們?cè)诶锩鎸?xiě)的 printf 語(yǔ)句,而且多了函數(shù)調(diào)用的語(yǔ)句。普通版則是只執(zhí)行程序就 OK 了。通過(guò)今天的綜合示例的編寫(xiě),總結(jié)如下:1、目錄是可以成為目標(biāo)的依賴(lài)的,在規(guī)則中創(chuàng)建目錄;2、預(yù)定義函數(shù)是 makefile實(shí)戰(zhàn)時(shí)不可或缺的部分;3、規(guī)則中的模式匹配可以直接針對(duì)目錄中的文件;4、可以使用命令行變量編譯特殊的目標(biāo)版本。


        歡迎大家一起來(lái)學(xué)習(xí) makefile 語(yǔ)言,可以加我QQ:243343083。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI