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