為什麼需要makefile檔案和makefile檔案的結構分析
本文是學習的總結,適用於初學者,有錯誤懇請指出
在Linux中,所有的原始碼都需要編譯成可執行檔案才能最終執行,實現需要的功能。
寫軟體的時候,如果將所有的功能和程式碼都寫在一個檔案當中,則只需要對這個檔案gcc即可生成想要的可執行檔案。
但規模很大的軟體顯然無法全部寫入一個檔案,另外,多人協同的要求也使得將所有程式碼寫入一個檔案成為不可能,所以,在實際的軟體工程中,會出現很多個檔案,包括標頭檔案、原始碼、巨集定義檔案、……,而且每個檔案需要include或引用其他的一些檔案,這些都可以在設計階段做好功能的分解以及任務的分工,那麼,在各個人分得的任務都完成之後就需要將各人的程式碼組成一個完整的產品。
在最終的組合過程中,必然面臨如下問題
1、哪些檔案需要先編譯
2、哪些檔案需要後編譯
3、對於每一個檔案,在編譯的過程中需要哪些輔助檔案或者已經完成的編譯檔案(*.o檔案)
更重要的是,在一個軟體產品最終完成,和上線執行之前,上述過程將進行很多次,這時將要面臨的其他問題是
4、檔案A修改之後,導致哪些檔案需要重新編譯
顯然,我們不可能為了檢視某一個檔案的修改之後的效果而將所有整個工程的每個檔案都重新編譯
要解決上述問題的思路是,將整個產品的所有的每一個檔案之間依賴關係表示清楚,然後按照彼此之間的關係決定編譯順序。
所謂依賴關係,比如,A程式碼中呼叫了程式碼檔案B和C,此時則稱A依賴B和C。
注意到,對於任何一個軟體產品而言,其中涉及的所有檔案之間的拓撲關係是一個樹,而不是網路。
所以,我們只需要從樹的根節點開始,每次描述一個檔案的依賴關係,直至達到每個葉節點,即可完成對整個依賴關係的描述。
這一解決思路的表現形式即makefile的結構,如下:
上述makefile檔案中,每兩行一個單元,每個單元的結構都是“*:*1.o *2.o *3.o ....”,然後第二行是對上一行中提到的的*1,*2,*3,……等檔案的gcc編譯命令
注意最後一行的clean,目的是清除所有的過程檔案,所以沒有依賴的檔案
總之,搞清楚目的才是理解之本,也能自然的降低學習的難度。
Makefile的基本知識,如果需要學習,那麼請參考: makefile 中文手冊(點選開啟連結)