Makefile文件編寫詳解

         在Linux下編寫小程序時,相信大家都知道怎麼做,直接編輯源文件(一般是.c和.cpp),然後採用gcc/g++來編譯源文件,生成執行文件,這樣一個簡單的應用程序就可以編寫完成。但是如果對於一個複雜應用程序的時候(包含很多源文件和頭文件),如果繼續採用“編輯-編譯-測試”的方式,則需要操作很多次,且只要其中某一個文件改動,其關聯到的文件都要重新編譯生成。因此,如果繼續採用單步編譯的方式,則會浪費很多時間且有時候造成混亂(文件太多,不知道哪些被改動,哪些沒有,特別是同一個項目由不同的人來維護的時候,問題更爲突出)。那麼怎麼樣才能做到高效的吧編寫複雜應用程序呢? 這就需要用到makefile文件了和make命令了。

       makefile文件主要由一組依賴關係和規則構成。每個依賴關係由一個目標(即要創建的文件:可執行文件或庫文件)和一組該目標所依賴的源文件組成,規則描述瞭如何通過這些依賴文件創建目標。下面以一個具體例子來分析,應用程序由以下幾個文件組成:

          main.c (輸入兩個數,打印加減乘除結果)、add_test.c(實現加法操作)、 sub_test.c(實現減法操作)、multiply_test.c (實現乘法操作)、div_test.c(實現除法操作) 和 Compro.h(定義加減乘除函數)。(代碼這裏就不貼了,因爲不是重點)。

         我們假定要生成的可執行文件即目標文件爲:myapp

  則makefile文件編寫如下:

 

        紅框表示的爲依賴關係,即生成的目標文件(:左邊文件)依賴的文件(:右邊文件)。而藍框表示的規則,即怎麼生成目標文件。這裏主要採用的gcc編譯器。

       編寫好makefile文件後,就可以通過make命令來執行makefile文件了,直接在上上述所在文件的目錄下執行make命令即可,當然如果你不是以makefile命名的話,比如你以aaa (當然這種命名方式也很差勁餓)命名,則可以執行 make -f aaa命令。這裏建議大家最好是採用Makefile命名方式(這種命名方式是可以直接在所在文件目錄下找到Makefile文件,因爲源文件和頭文件都是以小寫字母命名的)。執行完make命令後,看看生成的文件:

    

 myapp就是最終生成的程序可執行文件了,現在執行./myapp來運行下程序:

  

到這裏基本makefile文件即make操作就介紹完了,不過大家有沒有發現一個問題,雖然這個文件包含的源文件還不算少,但是源文件都是放在一塊的。特別是,c和.h文件放在一起,而一般中大型項目都包含很多模塊,並且.h和.c文件都是分別放在src和include目錄下,因此上面的程序還是沒有涉及到把源文件分類和把中大型模塊化,而只是吧源文件放置在同一目錄下,這樣結構極不清晰,也不方便維護。下面討論下怎麼實現模塊化的makefile文件編寫:

   針對上面的應用程序,可以將.c文件存放在/src目錄下,.h文件存放在/include目錄下,然後在/目錄下編寫makefile文件,具體實現如下:

       

其中 (1):紅框爲定義的宏。

          (2):藍框表示的生成中間文件.o的部分,這裏涉及到一些foreach函數,一些特許宏的定義比如 $< $@等

其中:foreach函數,$(foreach,<var>,<list>,<text>),表示把參數<list>中的單詞逐一取出放到參數<var>所指定的變量中,然後再執行<text>所包含的表達式。每次<text>會返回一個字符串,最後當整個循環結束時,<text>所返回的每個字符串所組成的整個字符串(以空格分隔),將會是foreach函數的返回值。

           $< 表示當前依賴文件的名字 ,$@ 表示當前目標文件名字。

           $(SRC_DIR)/%.o 表示$(SRC_DIR)目錄下即.c文件所在目錄/src下,所有.o目標文件,$(SRC_DIR)/%.c 即/src目錄下所有.c文件,其中.o和.c文件是一一對應的。

           (3):黑框表示的最終生成的可執行文件也就是$(TARGET) = compro_test了。

到此,makefile基本講完。

 

 

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章