真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

make--變量與函數(shù)的綜合示例自動(dòng)生成依賴關(guān)系

一.變量與函數(shù)的示例

示例的要求
1.自動(dòng)生成target文件夾存放可執(zhí)行文件
2.自動(dòng)生成objs文件夾存放編譯生成的目標(biāo)文件
3.支持調(diào)試版本的編譯選項(xiàng)
4.考慮代碼的擴(kuò)展性
完成該示例所需的
1.$(wildcardpattern)獲取當(dāng)前工作目錄中滿足pattern的文件或目錄列表
2.$(addprefix,_name)給名字列表name的每一個(gè)名字增加前綴_prefix
關(guān)鍵技巧
1.自動(dòng)獲取當(dāng)前目錄下的源文件列表(函數(shù)調(diào)用)

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),平定企業(yè)網(wǎng)站建設(shè),平定品牌網(wǎng)站建設(shè),網(wǎng)站定制,平定網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,平定網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

SRC : = $(wildcard *.c)

2.根據(jù)源文件列表生成目標(biāo)目標(biāo)文件列表(變量的值替換)

OBJS := $(SRCS:.c=.o)

3.對(duì)每一個(gè)目標(biāo)文件列表加上路徑前綴(函數(shù)調(diào)用)

OBJS := $(addprefix path/,$(OBJS))

規(guī)則中的模式替換(目錄結(jié)構(gòu))
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
編譯規(guī)則的依賴
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
編譯的示例代碼及運(yùn)行結(jié)果
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系

CC := gcc
MKDIR := mkdir
RM := rm -fr

DIR_OBJS := objs
DIR_TARGET := target

DIRS := $(DIR_OBJS) $(DIR_TARGET)

TARGET := $(DIR_TARGET)/hello-makefile.out
# main.c const.c func.c
SRCS := $(wildcard *.c)
# main.o const.o func.o
OBJS := $(SRCS:.c=.o)
# objs/main.o objs/const.o objs/func.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)

運(yùn)行結(jié)果
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
小結(jié):
1.目錄可以成為目標(biāo)的依賴,在規(guī)則中創(chuàng)建目錄
2.預(yù)定義函數(shù)是makefile不可或缺的部分
3.規(guī)則這的模式匹配可以直接針對(duì)目錄中的文件
4.可以使用命令行變量編譯特殊的目標(biāo)版本

二.自動(dòng)生成依賴關(guān)系

一.編譯行為帶來(lái)的缺陷
1.預(yù)處理器將頭文件中的代碼直接插入源文件
2.編譯器只能通過(guò)預(yù)處理后的源文件產(chǎn)生目標(biāo)文件‘
所以,規(guī)則中以源文件為依賴,命令可能無(wú)法執(zhí)行
示例
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
在第一張圖可以看出main.c與func.c是依賴于func.h的,此時(shí)將func.h中的打印信息改了之后運(yùn)行的結(jié)果如下圖所示
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
由運(yùn)行的結(jié)果可以看到把打印的信息改變了,但是make之后的結(jié)果并沒(méi)有改變,這是因?yàn)椴](méi)有把func.h算子啊依賴上去,所以在它的打印信息改變之后,結(jié)果還是一樣的 ,需要進(jìn)行以下修改才能實(shí)現(xiàn)修改打印信息,運(yùn)行結(jié)果也改變(如圖所示)
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
由上面的解決方法可以得出
1.頭文件作為依賴條出現(xiàn)于每個(gè)目標(biāo)對(duì)應(yīng)的規(guī)則中
2.當(dāng)頭文件改動(dòng),任何源文件都將被重新編譯
3.當(dāng)項(xiàng)目中頭文件數(shù)量巨大時(shí),makefile將很難維護(hù)

二.改進(jìn)的方法
1.通過(guò)命令自動(dòng)生成對(duì)頭文件的依賴
2.將生成的依賴自動(dòng)包含進(jìn)makefile中
3.當(dāng)頭文件改動(dòng)后,自動(dòng)確認(rèn)需要重新編譯的文件
所需條件
1.Linux命令sed
2.編譯器依賴生成選項(xiàng)gcc -MM(gcc -M)
A.Linux中的sed命令
1.sed是一個(gè)流編輯器,用于流文本的修改(增/刪/查/改)
2.sed可用于流文本的中的字符串替換
3.sed的字符串替換方式為 :sed 's:src:des:g'
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
B.sed的正則表達(dá)式支持
1.在sed中可以用正在表達(dá)式匹配替換目標(biāo)
2.并且可以使用匹配的目標(biāo)生成替換結(jié)果
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
C.gcc關(guān)鍵編譯選項(xiàng)(生成依賴關(guān)系)
1.獲取目標(biāo)的完整依賴關(guān)系(gcc -M test.c)
2.獲取目標(biāo)的部分依賴關(guān)系(gcc -MM test.c)
D.makefile中的include關(guān)鍵字
1.類似C語(yǔ)言中的include
2.將其它文件的內(nèi)容原封不動(dòng)的搬入當(dāng)前文件

make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
make對(duì)include關(guān)鍵字的處理方式
a.在當(dāng)前目錄搜索或指定目錄搜索目標(biāo)文件
1.搜索成功:將文件搬入當(dāng)前makefile中
2.搜索失?。寒a(chǎn)生警告
a.以文件名作為目標(biāo)查找并執(zhí)行對(duì)應(yīng)規(guī)則
b.當(dāng)前文件名對(duì)應(yīng)的規(guī)則不存在時(shí),最終產(chǎn)生錯(cuò)誤
代碼示例及運(yùn)行結(jié)果
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
makefile中命令的執(zhí)行機(jī)制
1.規(guī)則中的每個(gè)命令默認(rèn)是在一個(gè)新的進(jìn)程中執(zhí)行
2.可以通過(guò)連續(xù)符(;)將多個(gè)命令組成一個(gè)命令
3.組合的命令依次在同一個(gè)進(jìn)程中被執(zhí)行
4.set -e指定發(fā)生錯(cuò)誤后立即退出執(zhí)行

示例:
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
該代碼主要的目的是想在當(dāng)前文件夾下新建test文件夾,然后進(jìn)入test文件夾,創(chuàng)建subtest文件夾,但是make之后的結(jié)果如圖所示,可以看到subtest與test文件夾在同一級(jí)目錄,不是我們要的結(jié)果
經(jīng)過(guò)修改之后的代碼及運(yùn)行結(jié)果
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系

三.綜合示例

思路:通過(guò)gcc -MM 和sed得到.dep依賴文件,通過(guò)inclue指令包含所有的.dep依賴文件
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系

運(yùn)行的結(jié)果:
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
該示例可能會(huì)出現(xiàn)的問(wèn)題是如何在makefile在組織.dep文件到指定目錄
解決的思路:
當(dāng)include發(fā)現(xiàn).dep文件不存在:
1.通過(guò)規(guī)則和命令創(chuàng)建deps文件
2.將所有.dep文件創(chuàng)建到deps文件夾
3..dep文件記錄目標(biāo)文件的依賴關(guān)系
代碼實(shí)現(xiàn)
make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系make--變量與函數(shù)的綜合示例  自動(dòng)生成依賴關(guān)系
總結(jié):
a.使用減號(hào)(-)不但關(guān)閉了include發(fā)出的警告,同時(shí)關(guān)閉了錯(cuò)誤,當(dāng)錯(cuò)誤發(fā)生時(shí)make將忽略這些錯(cuò)誤
b.當(dāng)目標(biāo)文件不存在(以文件名查找規(guī)則,并執(zhí)行)
c.當(dāng)目標(biāo)文件不存在,且查找到的規(guī)則在創(chuàng)建了目標(biāo)文件(將創(chuàng)建成功的目標(biāo)文件包含進(jìn)當(dāng)前makefile)
d.當(dāng)目標(biāo)文件存在(將目標(biāo)文件包含進(jìn)當(dāng)前makefile,以目標(biāo)文件名查找是否有相應(yīng)的規(guī)則)
e.當(dāng)目標(biāo)文件存在,且目標(biāo)名對(duì)應(yīng)的規(guī)則被執(zhí)行(規(guī)則中的命令更新了目標(biāo)文件,make重新包含目標(biāo)文件,替換之前包含的內(nèi)容),目標(biāo)文件未被更新(無(wú)操作)


新聞名稱:make--變量與函數(shù)的綜合示例自動(dòng)生成依賴關(guān)系
網(wǎng)站網(wǎng)址:http://weahome.cn/article/pgdeed.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部