1. 程式人生 > 實用技巧 >Ubuntu——makefile的引入(非常通俗易懂)

Ubuntu——makefile的引入(非常通俗易懂)

在嵌入式開發中我們經常用vim編輯程式碼,用gcc編譯器來編譯我們的程式碼,具體實現過程如下:

(1)首先vim hello.c,進入vim編輯器,寫好程式碼

(2)利用gcc編譯器對程式碼進行編譯 gcc -o hello hello.c,然後就會生成hello可執行檔案,然後執行hello即可

執行結果如下圖所示

這是在Linux下使用C語言編寫程式碼的過程,可以看得到,只有一個頭檔案的時候還不麻煩,但在嵌入式開發的時候,通常都是由幾十段程式碼需要編譯,而有時候我們只需要改其中一個或幾個檔案,難道我要再用gcc一個一個編譯嗎?答案當然是這輩子都不可能這樣編譯的,於是就有了Makefile自動化編譯工具,下面我們來舉個小例說明:

①首先先來一個主函式main.c,這裡引入了兩個自定義標頭檔案,getnum用來得到鍵盤輸入的數,sumnum用來計算兩數之和。

②編寫getnum.c和getnum.h

③編寫sumnum.c和sumnum.h

⑥一共五個檔案,我們已經編寫好了

⑦編譯gcc main.c getnum.c sumnum.c -o main,生成main可執行檔案

⑧執行結果如下圖所示

本次示例只有三個檔案需要編譯,看起來還不算麻煩,但真正的開發中很多檔案,而且有時候我們需要修改個別的檔案,就沒必要所有都編譯一遍了吧,於是就要用到Makefile,接下來講如何使用Makefile

在講述這個Makefile之前,還是讓我們先來粗略地看一看Makefile的規則。

target... : prerequisites ...

command

...

...
-------------------------------------------------------------------------------

target也就是一個目標檔案,可以是Object File,也可以是執行檔案。還可以是一個標籤(Label),對於標籤這種特性,在後續的“偽目標”章節中會有敘述。

prerequisites就是,要生成那個target所需要的檔案或是目標。

command也就是make需要執行的命令。(任意的Shell命令)

但有一點要注意,command之前必須要有一個Tab的間距!!!

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

①首先在該目錄建立一個檔案叫Makefile,並寫入程式碼

main:main.o getnum.o sumnum.o //main檔案依賴於 main.o getnum.o sumnum.o
  2     gcc -o main main.o getnum.o sumnum.o //main檔案是通過 gcc -o main main.o getnum.o sumnum.o生成的 
  3 main.o:main.c//main.o依賴於main.c 
  4     gcc -c main.c//main.o是通過gcc -c main.o main.c生成的 
  5 getnum.o:getnum.c//getnum.o依賴於getnum.c
  6     gcc -c getnum.c//getnum.o是通過gcc -c getnum.o getnum.c生成的 
  7 sumnum.o:sumnum.c//sumnum.o依賴於sumnum.c 
  8     gcc -c sumnum.c//sumnum.o是通過gcc -c sumnum.o sumnum.c生成的 
  9 clean://執行清理命令 
 10     rm *.o//刪除所有.o檔案 
 11     rm main//刪除main可執行檔案

個人感覺,makefile就想一個套娃,寫清楚目標檔案依賴於什麼檔案,接下來一行就寫是什麼命令生成的

②刪除我們之前用gcc挨個編譯生成的檔案

③執行Makefile,可以看到我們已經生成了main可執行檔案

④執行一下,可以看到沒問題,但這還並不能體現Makefile的優勢

⑤接下來我們修改getnum.c,將輸入提示語改成中文

⑥再次Makefile一下,我們可以看到,因為我們只修改了getnum.c,所以只編譯了getnum.c,這就看出Makefile的優勢了吧,如果有很多的檔案,一個個執行的話,估計需要個吧小時,makefile就是檢測檔案的修改時間,如果更新了就編譯,真的超級方便

好了,今天就先講到這裡,如果有什麼問題,可以加QQ:1033278524,歡迎騷擾