Makefile學習心得

2022-09-13 02:12:13 字數 2309 閱讀 3566

昨天花好長一段時間來練習makefile,同時也在練習gcc,頗有收穫。gcc其實簡單,只要明白其操作過程和命令就能很好掌握。make的知識量要多一些,容我細細回顧!makefile單詞太長,我設個巨集mf下面就用它代替說明。

mf的目標是什麼,為什麼會出現這個工具,這個工具是為了解決什麼問題的?其實只要思考這個問題,我們能更清楚的了解mf,由於在mf之前老前輩們程式設計序的規模越來越大,導致老式的方法乙個檔案乙個檔案的編譯,那太麻煩太耗時了,而採用指令碼來執行則所有的操作都會重新做一次,這樣的方式對大型專案來說是絕對跟不上節奏的。所有有前輩就設計乙個軟體來完成事情,考慮到平常編譯過程中,先要將原始檔編譯成目標檔案,再將目標檔案鏈結成執行檔案,在這裡,若原始檔被修改,那麼對應的目標檔案也必須被重新編譯,同樣若目標檔案被修改,需要鏈結它來生成的執行檔案需要重新連線,而且只要保證這個規則就能保證,按這個要求來得到的執行檔案就是那些原始檔編譯後的結果。這也就是mf的核心啦,所有的功能概念規則約定都是在這個基礎上來擴充套件的。總的來說那就是這三條:

1. 所有的原始檔沒有被編譯過,則對各個c原始檔進行編譯並進行鏈結,生成最後的可執行程式;

2. 每乙個在上次執行make之後修改過的c源**檔案在本次執行make時將會被重新編譯;

3. 標頭檔案在上一次執行make之後被修改。則所有包含此標頭檔案的c原始檔在本次執行make時將會被重新編譯。

通過比較要生成的檔案和其依賴的檔案的修改時間,就可以確定是否進行編譯,若生成的檔案不存在那就更要進行編譯啦。這樣就產生了mf中的規則啦,如:

target... : prerequisites...

command

......

冒號左邊的為要生成的檔案,叫目標,右邊為目標的依賴,即指出生成這個檔案需要哪些檔案。第二行開始為操作命令,必須以tab縮排,為將依賴生成目標的命令列命令。比如gcc。而mf是將這些規則寫入mf檔案中,再分析依賴規則,最後決定操作哪些命令。

再說明幾個知識點和使用技巧:

1.mf可以認為分為兩個步驟,首先分析依賴關係,這樣可以得到一棵樹結構啦,並且可以發現哪些規則需要執行,然後就執行需要執行的規則,若沒有會提示make無需做任何事情。提示這點主要是在make不正常工作時,分析問題所在。

2.mf第乙個規則,為預設規則,使用make不指定目標時就從這個目標開始分析。模式依賴規則,只作為工具,不做最終規則。

3.mf乙個目標可以有多個規則,並且依賴將是這個目標所有規則的依賴的並集,這一點很重要,在自動產生依賴中要用到。

4.mf中可以使用一些偽目標來進行變數顯示,這也是為了分析問題而做的。比如我:

clean:

@echo cealn .d .o $(targ)

@-rm -f $(deps) $(objs) $(target) #在命令前加- 表示某一下出問題後選擇繼續進行

@echo 顯示變數 scrs:$(scrs)     objs:$(objs)    deps:$(deps)

5.mf的自動產生依賴,當我們原始檔很多時,我需在mf檔案中為每個檔案寫乙個規則,那這樣顯然不合習慣啦,所以可以自動產生依賴來完成這個操作。而這個機制其實不是mf提供的,他是採用系統命令來和依賴資訊檔案來實現的。因為gcc 的-m命令可以產生系統輸出檔案對應的全部依賴資訊,利用這一點,我們將這些資訊寫入到mf檔案中,在上面提到這些依賴資訊將有效。然後在mf檔案中寫出所有規則,這個簡便方法就可行了。先看下面模板:

$(dd)/%.d:$(sd)/%.$(***t)

@echo 生成依賴檔案 $@

@$(cc) -mm $(cflags) $(iflag) $< | \

sed -e 1's,^,$(od)/,' > $@

sinclude$(deps)

$(od)/%.o:$(sd)/%.$(***t)

@echo 生成目標檔案 $@:$

<

@-$(cc) -o $@ -c $< $(cflags) $(iflag)

dd為依賴資訊檔案目錄變數,sd為原檔案目錄變數,od為目標檔案目錄變數。這套sed命令表示在這一行串前加上目標檔案目錄,因為gcc -mm產生的字串冒號左邊的不帶目錄,所以要使用此命令,再輸出重定向到對應的.d檔案中。之後使用sinclude來加入這些資訊,再隨便寫個生成所以目標檔案的規則,依賴甚至可以不寫。

6.mf的include和sinclude,他們的引數可以為檔案或者目錄,目錄的話表示加入目錄內所有檔案,include若包含的檔案不存在,make會終止,而sinclude不會,sinclude與make的引數-include作用相同。

7.mf的匹配,make使用%來進行兩個模式的匹配,從模式塊中提取字串儲存在%中,再展開匹配塊中的%。

後記,通過幾天的學習和操作,make現在以及基本掌握啦,現在可以使用make來管理我的專案咯!

Linux學習心得(3) makefile

makefile概述 makefile是指定工程編譯規則的程式。就像乙個shell指令碼一樣,也可以執行作業系統的命令。自動化編譯 寫好makefile程式後,只需乙個make命令,完全自動編譯。make是乙個解釋makefile中指令的命令工具。makefile語法 由若干條規則組成,每條規則的語...

學習心得 python學習心得

自從來了深圳工作以後,尤其是屢屢面試碰壁以後。發現其實自己的知識面很窄,做筆試題的時候絞盡腦汁還是漏洞百出,並不是不會做,而是出現一大堆不該有的失誤。每次被問道,對資料庫了解嗎?說一大堆看起來很高階的東西 好啊,那我們寫幾個sql語句吧。馬上完蛋了,沒了手冊關鍵字都記不起。了解哪幾種指令碼語言,sh...

學習心得 我的學習心得

我是乙個已經步入中年的70後,離開校園已經20年了,因為當年的政策因素而未能圓我的大學夢,在20年的工作過程中總是因為缺少一張大學文憑而失去了很多機會,曾經也考慮過自考,但是乙個人去面對的時候總感覺心有餘而力不足。2018年3月份偶然讓我認識了尚德,原來自考還可以這樣學習。一直懷疑自己年紀大了記憶力...