問題一
創(chuàng)新互聯(lián)公司一直在為企業(yè)提供服務(wù),多年的磨煉,使我們?cè)趧?chuàng)意設(shè)計(jì),成都營(yíng)銷網(wǎng)站建設(shè)到技術(shù)研發(fā)擁有了開發(fā)經(jīng)驗(yàn)。我們擅長(zhǎng)傾聽企業(yè)需求,挖掘用戶對(duì)產(chǎn)品需求服務(wù)價(jià)值,為企業(yè)制作有用的創(chuàng)意設(shè)計(jì)體驗(yàn)。核心團(tuán)隊(duì)擁有超過(guò)十年以上行業(yè)經(jīng)驗(yàn),涵蓋創(chuàng)意,策化,開發(fā)等專業(yè)領(lǐng)域,公司涉及領(lǐng)域有基礎(chǔ)互聯(lián)網(wǎng)服務(wù)達(dá)州托管服務(wù)器、app軟件開發(fā)公司、手機(jī)移動(dòng)建站、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)絡(luò)整合營(yíng)銷。
.PHONY : all
all:
@echo "command-1"
VAR:=test
all:
@echo "all:$(VAR)"
make之后的結(jié)果如圖所示
可以得出的結(jié)論是
A.makefile中出現(xiàn)同名目標(biāo)時(shí)
依賴:所有的依賴將合并在一起,成為目標(biāo)的最終依賴
命令:當(dāng)多處出現(xiàn)同一目標(biāo)時(shí),make發(fā)出警告;所有之前定義的命令被最后定義的命令取代
注意:當(dāng)使用include關(guān)鍵字包含其他文件時(shí),需要確保被包含文件中的同名目標(biāo)只有依賴,沒有命令;否則,同名目標(biāo)的命令將被覆蓋
隱式規(guī)則
1.make提供了一些常用的,例行的規(guī)則實(shí)現(xiàn)
2.當(dāng)相應(yīng)目標(biāo)的規(guī)則未提供時(shí),make嘗試隱式規(guī)則
3.make提供了生成目標(biāo)文件的隱式規(guī)則
4.隱式規(guī)則會(huì)使用預(yù)定義變量完成編譯工作
5.改變預(yù)定義變量將部分改變隱式規(guī)則的行為
6.當(dāng)存在自定義規(guī)則時(shí),不再使用隱式規(guī)則
深入理解隱式規(guī)則
A.當(dāng)make發(fā)目標(biāo)的依賴不存在時(shí)
1.嘗試通過(guò)依賴名逐一查找隱式規(guī)則
2.并且通過(guò)依賴名推導(dǎo)可能需要的源文件
隱式規(guī)則的副作用
1.編譯行為難以控制--大量使用隱式規(guī)則可能產(chǎn)生意想不到的編譯行為
2.編譯效率低下--make從隱式規(guī)則和自定義規(guī)則中選擇最終使用的規(guī)則
隱式規(guī)則鏈
當(dāng)依賴的目標(biāo)不存在時(shí),make會(huì)極力組合各種隱式規(guī)則對(duì)目標(biāo)進(jìn)行創(chuàng)建,進(jìn)而產(chǎn)生意料之外的編譯行為---需要名為N.o的目標(biāo):N.y->N.c>N.o
查看隱式規(guī)則
隱式規(guī)則的禁用
A.局部禁用
1.在makefile中自定義規(guī)則
2.在makefile在定義模式(如:%.o:%.p)
B.全局禁用
make -r
后綴規(guī)則的簡(jiǎn)介
1.后綴規(guī)則是舊式的“模式規(guī)則”
2.可以通過(guò)后綴描述的方式自定義規(guī)則
雙后綴規(guī)則--定義一對(duì)文件后綴(依賴文件后綴和目標(biāo)文件后綴),如:.cpp<==>%.o:%.cpp
單后綴規(guī)則--定義單個(gè)文件后綴(源文件后綴),如.c<==>%:%.c
關(guān)于后綴規(guī)則的注意事項(xiàng)
1.后綴規(guī)則中不允許有依賴
2.后綴規(guī)則必須有命令,否則無(wú)意義
3.后綴規(guī)則逐步被模式規(guī)則取代
小結(jié):
1.當(dāng)多處出現(xiàn)同一目標(biāo)的命令時(shí),只有最后定義的命令有效
2.make提供了一系列的而隱式規(guī)則可使用
3.當(dāng)makefile中未定義相關(guān)規(guī)則時(shí),嘗試使用隱式規(guī)則
4.隱式規(guī)則中可能使用make中的預(yù)定義變量
5.改變預(yù)定義變量可部分改變預(yù)定義規(guī)則的行為
6.隱式規(guī)則可能造成意想不到的編譯行為
7.在實(shí)際工程項(xiàng)目中盡量不使用隱式規(guī)則
8.后綴規(guī)則是一種舊式的模式規(guī)則
9.后綴規(guī)則正逐步被模式規(guī)則取代
A.常用的源碼管理方式
項(xiàng)目中的makefile必須能夠正確的定位源文件和依賴文的文件,最終編譯可執(zhí)行程序代碼如下圖
如圖所示:inc文件夾是頭文件,而src文件夾是源文件,makefile文檔程序如圖所示,make之后的結(jié)果如圖所示
生成該結(jié)果的原因是在當(dāng)前文件夾中不存在func.c
特殊的預(yù)定義變量VPATH(全大寫)
1.VPATH變量的值用于指示make如何查找文件
2.不同文件夾可作為VPATH的值同時(shí)出現(xiàn)
3.文件夾的名字之間需要用分隔符進(jìn)行區(qū)分
make對(duì)于VPATH值的處理方式
1.當(dāng)前文件找不到需要的文件時(shí),VPATH會(huì)被使用
2.make會(huì)在VPATH指定的文件夾中依次搜索文件
3.當(dāng)多個(gè)文件夾存在同名時(shí),選擇第一次搜索到的文件
注意事項(xiàng):
1.VPATH只能決定make的搜索路徑,無(wú)法決定命令的搜索路徑
2.對(duì)于特定的編譯命令(gcc),需要獨(dú)立指定編譯搜索路徑
3.
對(duì)之前示例的修改及運(yùn)行結(jié)果如圖所示
VPATH存在的問題--當(dāng)inc文件夾意外出現(xiàn)源文件(C/Cpp文件),那么可能產(chǎn)生編譯錯(cuò)誤
替換方案:vpath關(guān)鍵字(全小寫)
1.為不同類型的文件指定不同的搜索路徑
2.語(yǔ)法--在Directory中搜索符合Pattern的規(guī)則的文件
運(yùn)行的實(shí)例及運(yùn)行結(jié)果如圖所示
取消搜索規(guī)則:
1.取消已經(jīng)設(shè)置的某個(gè)搜索規(guī)則
.vpath Pattern
2.取消所有已經(jīng)設(shè)置的規(guī)則
.vpath
問題1:當(dāng)VPATH和vpath同時(shí)出現(xiàn)時(shí),make會(huì)如何處理
運(yùn)行的實(shí)例及結(jié)果圖
當(dāng)把src2中的func.c改成func.cpp再次進(jìn)行make
運(yùn)行的結(jié)果
對(duì)比得出的結(jié)論
1.make首先在當(dāng)前文件夾搜索需要的文件
2.如果失敗
a.make優(yōu)先在vpath指定的文件夾中搜索目標(biāo)文件
b.當(dāng)vpath搜索失敗時(shí),轉(zhuǎn)而搜索VPATH指定的文件夾
問題2--當(dāng)使用vpath對(duì)同一個(gè)Pattern指定多個(gè)文件夾時(shí),make會(huì)如何處理
實(shí)例及運(yùn)行結(jié)果如圖所示
結(jié)論:
1.make首先在當(dāng)前文件夾搜索需要的文件
2.如果失敗
a.make以自上而下的順序搜索vpath指定的文件夾
b.當(dāng)找到目標(biāo)文件,搜索結(jié)束
問題3--通過(guò)VPATH指定搜索路徑后,make如何決定目標(biāo)文件的最終位置
將第一次運(yùn)行的結(jié)果生成的app.out放置src文件夾下的運(yùn)行make結(jié)果圖如圖所示
結(jié)論:
1.當(dāng)app.out完全不存在--make在當(dāng)前文件夾下創(chuàng)建app.out
2.當(dāng)src文件夾中存在app.out--所有目標(biāo)和依賴的新舊關(guān)系不變,make不會(huì)重新創(chuàng)建app.out;當(dāng)依賴文件被更新,make在當(dāng)前文件夾下創(chuàng)建app.out
1.VPATH變量用于指示make如何查找文件
2.make會(huì)在VPATH指定的文件夾中依次搜索文件
3.vpath關(guān)鍵字可以為不同類型的文件指定不同的搜索路徑
4.vpath比VPATH更靈活易用,可動(dòng)態(tài)設(shè)置/取消搜索路徑
5.盡量使用vpath為不同文件指定搜索路徑
6.不要在源碼文件夾中生成目標(biāo)文件
7.為編譯得到的結(jié)果創(chuàng)建獨(dú)立的文件夾