跟我一起來玩轉Makefile 一)

2021-09-26 15:40:24 字數 2378 閱讀 5751

乙個c工程:

*.o主程式模組(100個c檔案)

---------liba.a(功能模組a(1000個c檔案和100

個**件)

--------libb.a功能模組b

make和makefile的存在正是為了解決上述兩個問題:

1.makefile檔案幫助我們記錄了整個專案工程的所需編譯的檔案列表,這樣我們在編譯時僅需輸入簡單的make命令就能編譯出我們期望的結果。

2.makefile檔案反映整個專案中各個模組的依賴關係,這樣我們改動了某些原始檔後,僅需簡單的輸入make命令,make工具就會根據makefile檔案裡秒速的依賴關係幫助我們分析哪些模組需要重新編譯,並執行相應操作。

**

makefile如何記錄整個專案工程的所有需要編譯的檔案列表及如何反映整個專案中各個模組的依賴關係?

提供了makefile策略描述後,make工具又是是如何解析makefile檔案來幫助我們構建其編譯系統的?

**

** make 的工作機理

那make工具又到底是如何工作的呢?解釋make的工作機理,需分別回答以下3個問題:

make命令如何使用 ;

make從哪讀取makefile;

make如何解析執行makefile檔案的規則。**

在讀取完makefile的內容後,make工具並不是逐條去執行makefile裡的規則,而是以某條規則為突破口,多公尺諾骨牌效應式的去執行makefile裡的規則。而這條作為突破口的規則的目標,稱為終極目標 ,我們可以在執行make時以引數的形式指定終極目標,從而執行作為突破口的規則,如果我們不顯式指定終極目標,make一般情況下將選擇makefile的第一條規則的目標作為終極目標。

make解析makefile的流程如下:

假設有mekefile內容如下:

終極目標:依賴a  依賴b 依賴c

終極目標命令

依賴a:子依賴a1 子依賴a2

依賴a命令

依賴b:子依賴b1 子依賴b2

依賴b命令

依賴c:子依賴c1 子依賴c2

依賴c命令

過程一,以終極目標為樹根,解析出整顆依賴樹:

過程二,對整顆依賴樹以從底到上,從左到右的順序,解析執行每一條規則:

最後就是要編寫我們的makefile了,一般在編寫makefile之前都需要先分析清楚整個工程各個模組的依賴關係,及相應的生成命令。我們的project_******工程最終生產的是乙個叫******的可執行檔案,而該可執行檔案是使用gcc命令編譯main.c和******.c生成的,因此我們的整個工程的關係依賴圖,如下:

1-2.2.3-1

因此我們的makefile可以這麼寫:

******: main.c ******.c

gcc -o ****** main.c ******.c

接下來,我們來編寫 /home/shiyanlou/code/project_******/makefile:

$ cat > makefile <2.2.4 執行驗證 makefile

下面我們分三個步驟來驗證一下我們的******專案的編譯系統:

能否編譯出可執行的******

$pwd #檢視當前路徑

$ls #檢視編譯前當前目錄

$make #編譯******專案

$ls #檢視編譯結果

$./****** #執行******可執行檔案

過程及結果如下:

1-2.2.4-1

已經編譯出******後,不改變任何原始檔再次執行編譯,是否不再執行任何操作

$ ls -lt #檢視當前專案中各檔案時間戳

$ make #再次執行編譯,檢視是否會執行編譯命令

過程及結果如下:

1-2.2.4-2

已經編譯出******後,修改任一原始檔是否能再次生成新的******可執行檔案。

makefile所包含的語法模組:注釋,提示符,內嵌函式,規則,變數定義

對比******專案,我們的complicated專案貌似只是多了乙個標頭檔案,但是我們的依賴關係圖卻多了一層.o檔案,這是為何?

我們上述的依賴關係圖更加準確的反映出了整個專案的構建過程,這樣我們據此寫出來的makefile才能更加靈活及更具可擴充套件性,記住:精確的分析清楚專案的依賴關係,是編寫乙個好的makefile的關鍵。

linux修改檔名:提供2種方法給你

mv wenjian zlliao

cp wenjian zlliao rm -f wenjian //這種方式要多一步 不推薦

一起玩轉Makefile

一般來說,無論是c或者c 工程,首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file,這個動作叫做編譯 compile 然後再把大量的object file resource和依賴的庫檔案合成執行檔案,這個動作叫作鏈結 link ...

跟我一起寫 Makefile

概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...

跟我一起寫 Makefile

概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...