我之前總結了gcc的用法,那麼在實際工作中,每次用gcc會很麻煩,尤其是一些大型項目,有很多的目錄結構,這個時候我們就需要編寫Makefile文件,然後在實際工作中,用make來編譯大型的項目,相信搞過Android開發的一定對make,make install,make clean不陌生,分別是編譯,安裝和清理,下面我就用一個例子來說明Makefile怎麼編寫,還是上一講的三個文件
func1.c
func2.c
main.c
來看一個簡單的Makefile
Makefile的基本規則:
目標:依賴文件
執行程序
注意,執行程序前面要用tab鍵
還有Makefile只會認第一個總的目標,其他都是配合的目標
這裡我們的目標就是生成main,那麼需要依賴func1.o func2.o main.o
gcc -o main func1.o func2.o main.o 就是執行程序
下面再分別寫目標func1.o func2.o main.o
.PHONY:clean
clean:
rm -rf main func1.o func2.o main.o
這是一個偽目標,後面不跟依賴,目的只是執行後面的執行程序,當我們執行make clean時,就會執行rm命令,把生成的一些中間文件都刪除掉
好了,我們執行make,執行make就會去尋找Makefile,跟進裡面的配置來執行
然後我們來執行主程序
然後執行make clean
Makefile有一個好處,比如修改了其中某一個文件,重新make的時候,只會重新編譯修改的文件,其他文件不會編譯
比如我們什麼都不改,再執行make
比如我們現在修改下main.c,再make
我們看到func1.c和func2.c沒有被重新編譯,這也是用make的好處
一個簡單的Makefile就是這樣,下面我們來說下變量,我們可以在Makefile中定義變量,看下面的Makefile文件
我們定義了一個變量,object,接下來所有用到依賴的地方都用這個變量替換
我們還可以把條件判斷加進來
很簡單,不多說了
再說兩個變量
$@:代表目標文件
$^:代表所有的依賴
剛才的程序還可以這樣改
我們注意到在執行make的時候,執行程序都會輸出,如果不想看到輸出,可以在執行程序前面加一個@ 符號
其實我們還可以定義install的偽目標,一般這個命令就是把生成的可執行文件,復制到/usr/local下
有的時候,我們的Makefile不是真正的編譯文件,而是包含的另外一個文件,那麼就會去尋找另外一個文件,再編譯,我們看下android源碼跟目標的Makefile
那麼其實我們也可以這樣做,我們把Makefile改名為android.mk,然後新建一個Makefile
其實Makefile的規則遠遠不止這些,我這只是總結了一些簡單的,如果想了解更多的,大家去官網查即可
好了,Linux Makefile編寫就總結到這裡,如有問題,歡迎指正,謝謝。
實驗平台上Makefile詳細的解釋 http://www.linuxidc.com/Linux/2014-01/94827.htm
Makefile之Linux內核模塊的Makefile寫法分析 http://www.linuxidc.com/Linux/2013-06/85842.htm
Makefile之寫demo時的通用Makefile寫法 http://www.linuxidc.com/Linux/2013-05/84679.htm
Makefile之大型工程項目子目錄Makefile的一種通用寫法 http://www.linuxidc.com/Linux/2013-05/84678.htm
Linux多文件編程及Makefile的編寫 http://www.linuxidc.com/Linux/2016-08/134249.htm
Makefile隱含規則 http://www.linuxidc.com/Linux/2016-10/136057.htm
Makefile自動生成依賴,自動化編譯 http://www.linuxidc.com/Linux/2016-02/128726.htm