作者前言
🎂 ??????🍧🍧🍧🍧🍧🍧🍧🎂
?🎂 作者介紹: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你會, 🎂
簡單介紹:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜歡學習C語言、C++和python等編程語言,是一位愛分享的博主,有興趣的小可愛可以來互討 🎂🎂🎂🎂🎂🎂🎂🎂
🎂個人主頁::小小頁面🎂
🎂gitee頁面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一個愛分享的小博主 歡迎小可愛們前來借鑒🎂
make/makefile
- **作者前言**
- 簡單的認識
- 依賴關系和依賴方法
- make工作原理
- make無法進行多次編譯的原因
- .PHONY偽目標
- 特殊符號
簡單的認識
make是一個指令
makefile是一個文件(保存的是依賴關系和依賴方法)
第一步
命名一定是makefile或者Makefile,不能改變
第二步
往該文件寫入一些代碼
mybin:Newcode1.c gcc -o New.out Newcode1.c
第三步
使用命令
make
出現的內容和自己寫入的沒有區別就算成功了
依賴關系和依賴方法
我們打開makefile進行寫入一些代碼
我們可以想象一下, 我們打電話回家要生活費的時候說:老爸,我是你兒子,我要生活費
這里我們可以把依賴關系比作老爸和兒子的關系以及 我要生活費是依賴方法
mybin : Newcode.c 其中mybin就是目標文件, Newcode.c就是依賴文件列表
依賴關系可以有多個,但是需要空格分開
只要我們把目標文件運行出來且是最新的,make指令就不會運行
我們還可以添加一些代碼
增加clean這個,這個clean是一個依賴關系,我們也可以換成其他依賴關系,
運行
make clean
就會刪除對應的文件,
如果我們把這些代碼調換一下位置,就會發現
直接運行make就會直接執行rm New這個方法,
表面,makefile和make形成目標文件的時候.默認是從上到下掃描makefile文件,默認形成的是第一個目標文件(makefile里面的目標文件)
make工作原理
1.我們輸入make指令,make會在當前目錄下找到"makefile"或者"Makefile"文件
2. 如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到“New”這個文件,并把這個文件作為最終的目標文件。
3. 如果New文件不存在,或是New所依賴的后面的Newcode1.c文件的文件修改時間要比new這個文件新(可以用 touch 測試),那么,他就會執行后面所定義的命令來生成hello這個文件。
4. 如果New所依賴的Newcode1.o文件不存在,那么make會在當前文件中找目標為Newcode1.o文件的依賴性,如果找到則再根據那一個規則生成Newcode1.o文件。(這有點像一個堆棧的過程)
例如:
在makefile文件中,我只是寫有依賴關系和依賴方法,和當前目錄只有.c文件,當我們使用make New這個命令事就會運行出下面的結果
也就是說,如果依賴關系列表里面的文件不存在,就會繼續往后進行依賴,找到了就會往返,不會執行其他多余的代碼
- 當然,你的C文件和H文件是存在的啦,于是make會生成 Newcode1.o 文件,然后再用 Newcode1.o 文件聲明make的終極任務,也就是執行文件New了。
- 這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文
件。 - 在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。
- make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦。
make無法進行多次編譯的原因
如果我們進行多次make 或者其他的指令就會發現
出現這個問題,是啥導致的呢?
其實就是make指令是根據目標文件的最新修改時間和依賴文件最新修改時間來對比,來判斷是否需要進行再次編譯的,如果依賴文件的最新修改時間比目標文件的最新修改時間還要新,就會再次編譯,
我們可以使用下面指令,查看文件的最新更新時間
stat New
stat Newcode1.o
圖中就可以看出依賴文件的最新時間比目標文件的最新時間要舊,所以就不會再次編譯
時間有三部分:
Access:文件的訪問時間
Modify:文件內容更改的最新時間
Change:文件屬性的最新更改時間
如圖:
我們改變文件內容,就會帶動著文件屬性(文件的大小)和內容的時間進行改變,
而我們改變文件屬性,文件屬性的時間也會跟著改變.
有些小可愛已經發現了Access的時間的改變有點不正常,有時候會改變,有時候不改變
是由于歷史的原因,早前的Linux由于文件的訪問非常的頻繁,Access更新頻繁,導致了運行速度下降了,為了解決這個問題,當文件訪問一定次數或者進行系統更新操作,才會進行Access的時間進行更新,
可以想出來,make是否編譯很大可能就是取決于Modify是否發生改變
更改文件時間
touch Newcode.c# 文件不存在創建,存在就會更新時間touch -m Newcode.c:#將Newcode.c文件的Modify時間更至最新。
touch -a Newcode.c:#將Newcode.c文件的Access時間更至最新。
touch -c Newcode.c:#將Newcode.c文件的Change時間更至最新。
.PHONY偽目標
圖中我們為New這個目標文件添加了這個偽目標,所以以New為目標文件的依賴關系和方法就會被執行,不管該依賴文件的時間是否更新,都會進行編譯
這個圖可以發現,.PHONY對哪個目標文件,就會針對哪個文件,不存在遺傳下去,
上面只是演示一下,.PHONY經常用于清除操作
特殊符號
我們在寫的過程中會經常重復一些文件名,很麻煩
make就提供了一些符號
$@:代表的目標文件
$^:代表的是依賴文件列表
運行結果
一樣可以運行出來
定義變量
我們還可以定義一些變量
在makefile文件開頭定義一些變量,我們還可以使用文件名來進行定義變量,
這樣也可以替代$@和$^
總結
這里的make就講到這里了有不懂的小可愛可以私聊我
?