如何寫makefile及makefile文件的執行


******************************************************

makefile有什么作用呢?它可以用來做什么呢?makefile有很大的功能,可以幫助你完成一些大型的工程。要想成為專業的人士,makefile的編寫是必須會的。

makefile關系到了整個系統的編譯規則。一個工程中的源文件很多,按類型功能等,放在了不同的文件夾中,makedfile就定義了一系列的規則,指定哪些文件先編譯,哪些文件后編譯,哪些文件重新編譯等等一系列的功能操作。makefile還有一個好處就是能進行自動化編譯,一旦makefile寫好了之后,只要一個make命令,整個工程就可以完全自動化編譯,大大提高了工作的效率。

**************************************

一、Makefile的簡單編寫

**************************************

在執行make命令時,當前文件夾中需要有一個makefile文件,makefile中編寫了怎么去編譯和鏈接這個程序的語句。

makefile的規則:

target ... : prerequisites ...

command

...

...

target是目標文件,可以是后邊編譯后生成的執行文件,可以只是一個標簽。

prerequisites是生成target所需要的文件或目標,就是依賴。

command就是在shell中輸入make后執行的命令

這就是一個文件依賴關系,target依賴於prerequisites中的文件,其生成規則定義在command中。target一定要比prerequisites新,不然的話command多定義的命令就會被執行,這就是Makefile的規則,也是Makefile最核心的內容。

************舉例*************

編寫add.c、sub.c、mul.c、div.c四個函數,用test.c將四個函數實現,然后編寫一個Makefile編譯函數

 

math文件夾中的文件包括:


編寫Makefile文件:


編寫完后,make一下,觀察過程:


這時,文件夾中的文件為:


以長列表的形式觀察個文件:

觀察可知:target文件test之所有文件中最新的,如果它不為新,那么在執行make命令時,test將會被更新。比如,用touch命令重新訪問add.o文件,那么add.o文件就比test新了,重新make命令一下,那個將會再次執行test后的command:如下圖所示:


 

******************************clean*******

一般來說,在Makefile文件中都會包含一個clean命令,它用來清楚make時產生的一些中間文件,比如add.o等,clean的編寫如下:


在shell中執行make clean,看到


即*.o文件都被刪除了;當再次執行make clean時,會出現這樣的結果:


意思是*.o文件已經都被刪除了,沒有這樣的文件了,報錯。

剛染我們提到:當target文件沒有它的依賴文件新時,會執行target之后的command命令,clean之后沒有依賴,而且它也不會在當前文件夾下產生一個clean,可是,如果當前文件夾下有一個clean文件時會發生什么呢?見下:


這是在當前文件夾中有個clean,我們touch一下它,然后執行make clean,結果他說clean已經是最新的了,clean沒有再次被執行,如何解決這個問題:可以在Makefile的最后加上.PHONY:


 

*******

這里有一點說明:clean不是一個文件,他只是一個動作名字,后邊也沒有什么依賴,那么在make時就不會自動去找文件的依賴,也就不會自動的執行clean后定義的command命令,所以要執行clean命令時,要在make后面明顯的指出這個動作名字:make clean。這樣的方法我們用到很多地方,比如程序的打包,動態庫靜態庫的建立等等。

*******

************************************************

二、make是怎么工作的?

************************************************

在默認的方式下,我們只輸入make命令,那么

1、make會在當前目錄下找到名字為Makefile或makefile的文件;

2、找到之后,它會找文件中的第一個目標文件target,如上面的例子中的test,並將下個文件作為最終的目標文件。

3、如果test文件不存在,或他的依賴比test新,那么要執行后面的command命令來生成test這個文件,如果他的依賴.o文件也不存在,那么就要找到.o的依賴,執行它的command,生成.o文件。

4、於是。make生成了自己的.o文件,再用.o文件生成最終的可執行文件test。

上述就是make的執行過程。make會一層一層的去找文件的依賴,如果其中出現錯誤,make就是停止工作並報錯。但是,如果comman有錯誤,make是不會去管的,它會繼續執行下面的操作,make只管文件的依賴。

當我們又添加了一個.c文件時,只需要在依賴中加上它就可以了。

********************************************

三、makefile中使用的變量

********************************************

在上面的例子中

看到三四行中的*.o都是重復的,那么我們可不可以用一個變量代替呢?我們隨意定義個變量objects來表示*.o:程序如下所示:


簡單了很多吧!

**************************************

四、使用make的自動推導

**************************************

make可以自動推導文件及文件依賴關系后面的命令,所以有時我們可以不用自己寫,而讓make自動生成。在例子中,*.o會自動的尋找*.c文件,所以我們的.c文件就可以省略不寫。於是,我們剛才寫的Makefile可更新為:

 

這種方法也就是make的“隱晦規則”,更為詳細的將在后面介紹。


是不是更簡單了呢

 

************************************************************************************************************************************

好了,這是最基本的makedile編寫。簡單的makefile就到這里!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM