溫馨提示×

溫馨提示×

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

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

make--隱式規(guī)則 路徑搜索及實例

發(fā)布時間:2020-07-05 20:05:00 來源:網(wǎng)絡(luò) 閱讀:358 作者:淡淡_小孩 欄目:系統(tǒng)運維

一.隱式規(guī)則

問題一

.PHONY : all
all:
    @echo "command-1"
VAR:=test
all:
    @echo "all:$(VAR)"

make之后的結(jié)果如圖所示
make--隱式規(guī)則 路徑搜索及實例
可以得出的結(jié)論是
A.makefile中出現(xiàn)同名目標時
依賴:所有的依賴將合并在一起,成為目標的最終依賴
命令:當多處出現(xiàn)同一目標時,make發(fā)出警告;所有之前定義的命令被最后定義的命令取代
注意:當使用include關(guān)鍵字包含其他文件時,需要確保被包含文件中的同名目標只有依賴,沒有命令;否則,同名目標的命令將被覆蓋

隱式規(guī)則
1.make提供了一些常用的,例行的規(guī)則實現(xiàn)
2.當相應(yīng)目標的規(guī)則未提供時,make嘗試隱式規(guī)則
3.make提供了生成目標文件的隱式規(guī)則
4.隱式規(guī)則會使用預(yù)定義變量完成編譯工作
5.改變預(yù)定義變量將部分改變隱式規(guī)則的行為
6.當存在自定義規(guī)則時,不再使用隱式規(guī)則

深入理解隱式規(guī)則
A.當make發(fā)目標的依賴不存在時
1.嘗試通過依賴名逐一查找隱式規(guī)則
2.并且通過依賴名推導可能需要的源文件
make--隱式規(guī)則 路徑搜索及實例
隱式規(guī)則的副作用
1.編譯行為難以控制--大量使用隱式規(guī)則可能產(chǎn)生意想不到的編譯行為
2.編譯效率低下--make從隱式規(guī)則和自定義規(guī)則中選擇最終使用的規(guī)則
隱式規(guī)則鏈
當依賴的目標不存在時,make會極力組合各種隱式規(guī)則對目標進行創(chuàng)建,進而產(chǎn)生意料之外的編譯行為---需要名為N.o的目標:N.y->N.c>N.o
查看隱式規(guī)則
make--隱式規(guī)則 路徑搜索及實例
隱式規(guī)則的禁用
A.局部禁用
1.在makefile中自定義規(guī)則
2.在makefile在定義模式(如:%.o:%.p)
B.全局禁用
make -r

后綴規(guī)則的簡介
1.后綴規(guī)則是舊式的“模式規(guī)則”
2.可以通過后綴描述的方式自定義規(guī)則
make--隱式規(guī)則 路徑搜索及實例
雙后綴規(guī)則--定義一對文件后綴(依賴文件后綴和目標文件后綴),如:.cpp<==>%.o:%.cpp
單后綴規(guī)則--定義單個文件后綴(源文件后綴),如.c<==>%:%.c
關(guān)于后綴規(guī)則的注意事項
1.后綴規(guī)則中不允許有依賴
2.后綴規(guī)則必須有命令,否則無意義
3.后綴規(guī)則逐步被模式規(guī)則取代

小結(jié):
1.當多處出現(xiàn)同一目標的命令時,只有最后定義的命令有效
2.make提供了一系列的而隱式規(guī)則可使用
3.當makefile中未定義相關(guān)規(guī)則時,嘗試使用隱式規(guī)則
4.隱式規(guī)則中可能使用make中的預(yù)定義變量
5.改變預(yù)定義變量可部分改變預(yù)定義規(guī)則的行為
6.隱式規(guī)則可能造成意想不到的編譯行為
7.在實際工程項目中盡量不使用隱式規(guī)則
8.后綴規(guī)則是一種舊式的模式規(guī)則
9.后綴規(guī)則正逐步被模式規(guī)則取代

二.路徑搜索

A.常用的源碼管理方式

make--隱式規(guī)則 路徑搜索及實例make--隱式規(guī)則 路徑搜索及實例
項目中的makefile必須能夠正確的定位源文件和依賴文的文件,最終編譯可執(zhí)行程序代碼如下圖
make--隱式規(guī)則 路徑搜索及實例make--隱式規(guī)則 路徑搜索及實例
如圖所示:inc文件夾是頭文件,而src文件夾是源文件,makefile文檔程序如圖所示,make之后的結(jié)果如圖所示
make--隱式規(guī)則 路徑搜索及實例
生成該結(jié)果的原因是在當前文件夾中不存在func.c
特殊的預(yù)定義變量VPATH(全大寫)
1.VPATH變量的值用于指示make如何查找文件
2.不同文件夾可作為VPATH的值同時出現(xiàn)
3.文件夾的名字之間需要用分隔符進行區(qū)分
make--隱式規(guī)則 路徑搜索及實例
make對于VPATH值的處理方式
1.當前文件找不到需要的文件時,VPATH會被使用
2.make會在VPATH指定的文件夾中依次搜索文件
3.當多個文件夾存在同名時,選擇第一次搜索到的文件
注意事項:
1.VPATH只能決定make的搜索路徑,無法決定命令的搜索路徑
2.對于特定的編譯命令(gcc),需要獨立指定編譯搜索路徑
3.make--隱式規(guī)則 路徑搜索及實例

對之前示例的修改及運行結(jié)果如圖所示
make--隱式規(guī)則 路徑搜索及實例
VPATH存在的問題--當inc文件夾意外出現(xiàn)源文件(C/Cpp文件),那么可能產(chǎn)生編譯錯誤
替換方案:vpath關(guān)鍵字(全小寫)
1.為不同類型的文件指定不同的搜索路徑
2.語法--在Directory中搜索符合Pattern的規(guī)則的文件
make--隱式規(guī)則 路徑搜索及實例
運行的實例及運行結(jié)果如圖所示
make--隱式規(guī)則 路徑搜索及實例
取消搜索規(guī)則:
1.取消已經(jīng)設(shè)置的某個搜索規(guī)則
.vpath Pattern
make--隱式規(guī)則 路徑搜索及實例
2.取消所有已經(jīng)設(shè)置的規(guī)則
.vpath

三 路徑搜索的幾個問題

問題1:當VPATH和vpath同時出現(xiàn)時,make會如何處理
make--隱式規(guī)則 路徑搜索及實例make--隱式規(guī)則 路徑搜索及實例

運行的實例及結(jié)果圖
make--隱式規(guī)則 路徑搜索及實例
當把src2中的func.c改成func.cpp再次進行make
運行的結(jié)果
make--隱式規(guī)則 路徑搜索及實例
對比得出的結(jié)論
1.make首先在當前文件夾搜索需要的文件
2.如果失敗
a.make優(yōu)先在vpath指定的文件夾中搜索目標文件
b.當vpath搜索失敗時,轉(zhuǎn)而搜索VPATH指定的文件夾
make--隱式規(guī)則 路徑搜索及實例

問題2--當使用vpath對同一個Pattern指定多個文件夾時,make會如何處理
make--隱式規(guī)則 路徑搜索及實例make--隱式規(guī)則 路徑搜索及實例
實例及運行結(jié)果如圖所示
make--隱式規(guī)則 路徑搜索及實例
結(jié)論:
1.make首先在當前文件夾搜索需要的文件
2.如果失敗
a.make以自上而下的順序搜索vpath指定的文件夾
b.當找到目標文件,搜索結(jié)束
make--隱式規(guī)則 路徑搜索及實例

問題3--通過VPATH指定搜索路徑后,make如何決定目標文件的最終位置
make--隱式規(guī)則 路徑搜索及實例
將第一次運行的結(jié)果生成的app.out放置src文件夾下的運行make結(jié)果圖如圖所示
make--隱式規(guī)則 路徑搜索及實例
結(jié)論:
1.當app.out完全不存在--make在當前文件夾下創(chuàng)建app.out
2.當src文件夾中存在app.out--所有目標和依賴的新舊關(guān)系不變,make不會重新創(chuàng)建app.out;當依賴文件被更新,make在當前文件夾下創(chuàng)建app.out

四 小結(jié):

1.VPATH變量用于指示make如何查找文件
2.make會在VPATH指定的文件夾中依次搜索文件
3.vpath關(guān)鍵字可以為不同類型的文件指定不同的搜索路徑
4.vpath比VPATH更靈活易用,可動態(tài)設(shè)置/取消搜索路徑
5.盡量使用vpath為不同文件指定搜索路徑
6.不要在源碼文件夾中生成目標文件
7.為編譯得到的結(jié)果創(chuàng)建獨立的文件夾

向AI問一下細節(jié)

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

AI