1. 程式人生 > >智慧閘道器韌體編譯學習筆記——Makefile

智慧閘道器韌體編譯學習筆記——Makefile

參考部落格:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225

一、makefile簡介

(1)程式的編譯和連結

為了更好的理解makefile的意義,有必要了解一些程式編譯的規範和方法。就C語言的編譯規則來看,首先要把原始檔編譯成中間程式碼檔案,在Windows下也就是 .obj 檔案,UNIX下是 .o 檔案,即 Object File,這個動作叫做編譯(compile)。然後再把大量的Object File合成執行檔案,這個動作叫作連結(link)。 總結一下,原始檔首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。

(2)為什麼要用makefile

當整個專案中有很多檔案,你使用的是命令列而不是IDE,那麼在對專案進行編譯時,需要一個檔案一個檔案的執行:

gcc -0 1.c 2.c 3.c ... -0 XXX.out

這樣不僅編譯命令複雜,檔案還需要一個個去查詢,很明顯會影響到這個專案的編譯效率。而使用makefile進行編譯可以很好的解決這問題,make命令執行時,需要一個makefile檔案,以告訴make命令需要怎麼樣的去編譯和連結程式。

(3)makefile規則和結構

我們可以簡單的把makefile認為是一份定義了原始檔間依賴關係、如何編譯各個原始檔並生成可執行檔案的說明書。makefile實現了“自動化編譯”,只需一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。比如我們可以這樣定義編譯規則

1.如果這個專案沒有編譯過,那麼我們的所有C檔案都要編譯並被連結。 2.如果這個專案的某幾個C檔案被修改,那麼我們只編譯被修改的C檔案,並連結目標程式。 3.如果這個工程的標頭檔案被改變了,那麼我們需要編譯引用了這幾個標頭檔案的C檔案,並連結目標程式。

makefile基本結構

Target : Prerequisites....
	Command....
	........
	......

Target:規則的目標,最終生成檔案的名字或者是中間過程檔名,也可以是make執行的動作的名稱。 Prerequisites:規則的依賴,生成目標所必須的檔名列表。 Command:規則的命令。規則需要執行的動作 注意

:這裡需要注意的是,命令前面使用的是TAB鍵,而不是空格,使用空格會出現錯誤。

這是一個檔案的依賴關係,也就是說,target這一個或多個的目標檔案依賴於prerequisites中的檔案,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的檔案比target檔案要新的話,command所定義的命令就會被執行。這就是Makefile的規則。也就是Makefile中最核心的內容。

(4)makefile簡單示例

fun1: 
	echo "fun1"
fun2:
	echo "fun2"
	ls

執行結果如下圖所示: 在這裡插入圖片描述 從上述列印結果可以看到,執行 make 後指運行了fun1的command部分,原因是在執行make過程中,如果不加入引數,則預設執行makefile的第一個規則。