Linux 應用編程之 "一文搞定 Makefile"-上-

ID:嵌入式情報局

作者:情報小哥

1 什麼是 Makefile

    在之前學習 C 程序的編譯過程中,我們知道編譯一個程序還比較簡單, 如果要編譯多個文件,或者不同文件夾中的文件,需要生成不同的庫文件,以及確定這些文件的編譯先後順序,往往所需要的命令行特別多,而且比較複雜,甚至對於以後項目的維護也比較麻煩。

    再想想如果我們需要編譯 Linux 內核這樣好幾 W 個文件的項目難道需要我們一個命令的輸入嗎 ? 那估計是一場噩夢。

    那麼這個時候如果我們能夠把所有的編譯規則全部規範到文件中,然後通過解析該文件去執行對應的編譯指令,這樣就大大簡化指令的複雜度,同時降低了編譯程序過程中所帶來的錯誤。

    根據上面的需求就產生了 Makefile, 我們的編譯和處理規則就放在 Makefile 文件中,通過 Makefile 工具解析 Makefile 文件中的命令來指導整個工程的編譯過程。

    當然 Makefile 文件中的命令書寫是有一定的規範的,這也是今天我們所要講到的重點,一旦該文件編寫好以後在 Linux 命令行中執行一條 make 命令即可自動編譯整個工程,不但提高了開發效率也便於後期維護。

    當然不同廠家的 make 稍有不同,並且語法上也有點區別,不過基本思想都差不多,主要還是落在目標依賴上來,這裏以最廣泛的 GNU Make 跟大家講解。

2Makefile 文件基本規則

    上面的爲大家展示了 Makefile 的核心規則,有點類似於一位廚師做菜,目標就是做一碗好菜,那麼所謂的依賴就是各種食材、各種廚具等等,然而有了這些依賴還不夠需要廚師有着非常好的廚藝才能做出一道好菜。

    同時這些依賴也有可能此時此刻並不存在,需要現場製作,或者由其他廚師做好,那麼這個依賴就成爲了其他規則的目標,該目標也會有它自己的依賴和命令,這樣形成一層一層遞歸依賴組成了 Makefile 文件。

總結

3 簡單使用 Makefile

    下面小哥就之前代碼簡單演示一下 Makefile:

    上圖是 makefile 文件,最終爲了生成 Test 文件,需要三個 *.o 文件,然後三個. o 文件又分別依賴於對應的 *.c 文件,這樣加上對應的 gcc 命令就構成了一個基本的 makefile。

**    注意 : 2/4/6/8 行均爲 tab 鍵。**

    下面使用 make 命令來編譯生成 test 目標文件

    這樣我們執行 make 命令一鍵就搞定了所有的編譯任務,如果下次需要改變編譯過程就直接修改對應的 makefile 文件中的規則即可。

**    有類比過 windows 裏面 IDE 環境中編譯器使用的小夥伴都知道在 windows 裏面的開發工具編譯通過一鍵即可搞定所有編譯內容。難道 windows 中的開發工具更強大一些?**

    其實不然,我們在 windows 中構建對應的工程文件的過程中通過圖形界面就悄悄的把類似的 makefile 文件給生成了,那麼當點擊編譯的時候就相當於在命令行裏面執行 make,其實都是類似的,僅僅只是我們平時使用 windows 更多一點,更加容易接受。

   當然這裏僅僅只是演示了一些最簡單的操作,比較麻煩的還是命令部分可以使用到通配符和 shell 指令等等,這樣會增加一定的複雜度,其實 makefile 本身並沒有太大的難度。

    下一節小哥將爲大家補充一些 makefile 更多便捷的操作,當然現在也出現了許多類似於 cmake 這樣的便捷工具,不過其核心還是 makefile!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/VnmoWA0vyRLvYjS1DBPNTA