linux-----makefile文件的編寫

makefile文件的編寫

說道makefile文件,想必大家在學習 linux過程中都會遇到,今天我們來講講makefile文件

先簡單的說說makefile是什麼?makefile項目代碼的管理工具,管理程序的源代碼;

那我們爲什麼要寫出makedile呢,原因在於如果我們需要做一個項目,項目裏面包含了100個甚至更多的源文件,我們都知道,源文件編程我們要的可執行文件,就得進行預編譯,編譯,彙編,連接過程,在liunx系統下,這個時候我們要得到結果,我們就需要一個源文件一個一個的進行語句編譯彙編處理,那爲了簡便這個過程,於是就有了makefile文件的產生;

舉個例子說明一下吧,我們可以看到當前目錄下有兩個文件,一個是比大小main.c,一個是計算器Calculator.c,我們要實現他們就得一個一個進行源文件-> .o文件,再由.o文件->可執行文件;
在這裏插入圖片描述
而有了makefile文件我們就可以這麼編寫:
在這裏插入圖片描述
那麼我們可以清晰的看到執行make命令後,我們的兩個文件都編譯彙編好了
相信大家一定很感興趣,這個makefile文件時怎麼編寫的
記下來說一下makefile文件編寫的規則:

目標(target) : 需要的條件(dependencies) (注意冒號兩邊有空格)
    命令(system command)  (注意前面用tab鍵開頭)

eg:我寫的這個makefile文件:
在這裏插入圖片描述

我們看到這,有的小夥伴救問了,如果我的源程序很多,那豈不是要敲出很多這個執行語句;
那接下來我就告訴你們怎麼優化這個代碼:
在這裏插入圖片描述
我們可以看到我們可以給目標賦值,而$就是去除包含的文件的內容,我們也能知道當上面的目標沒有得到滿足的需要的條件,就會向下檢索,一直找到需要的文件 比如生成target目標需要main.o和test.o所以下面出現main.o和test.o的目標代碼;其他諸如此類當最終目標文件依賴多個.o時,將依賴的多個.o 一起寫到main: 後面,然後依次以目標:依賴文件 gcc… 的格式,羅列所有依賴關係;

由於在上面的過程中生成了多箇中間.o文件(實際工程中肯定是比較多的),所以每次編譯完成,後續基本還需要進行一定的清理工作,這時候就用上一個 “clean” (後面細說一下)來清理。

我的虛擬機出現了點問題 就不能使用包含的例子向大家展示,大家可以在下面多多試試;
在這裏插入圖片描述
這段代碼中增加了clean功能,可以把多餘的.o 文件刪除;
注意: .PHONY意思表示clean是一個“僞目標”。也即是無論clean是否最新,一定執行它。rm命令前面加了一個小減號的意思就是,也許某些文件出現問題,但並不理睬。當然,clean的規則不要放在文件的開頭,否則這就會變成make的默認目標,相信誰也不願意這樣。不成文的規矩是——“clean從來都是放在文件的最後”

其實還可以進行優化 但是我由於電腦的原因,知識點給大家理解:

從前面的makefile編寫來看,  當中我們每寫一個依賴關係就需要寫一個形如gcc X.c  -o  X.o生成命令,這裏還好,若是較大的工程,這樣難免就太繁瑣了,所以據瞭解,一般在公司專門編寫makefile的人是不會那樣寫的。還有寫着更簡潔方式,就是利用下面這幾個符號:
  $^    代表所有的依賴文件
  $@  代表所有的目標文件  
  $<   代表第一個依賴文件

關於clean:
   它只不過是一個動作名字,有點像c語言中的lable一樣,其冒號後什麼也沒有,那麼,make就不會自動去找它的依賴性,也就不會自動執行其後所定義的命令。要執行其後的命令(不僅用於clean,其他lable同樣適用),就要在make命令後明顯得指出這個lable的名字。這樣的方法非常有用,我們可以在一個Makefile中定義不用的編譯或是和編譯無關的命令,比如程序的打包,程序的備份,等等。

那麼我們已經簡單的會寫makefile文件了,那麼makefile文件時怎麼運行的呢:

1、make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。

2、如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到“main”這個文件,並把這個文件作爲最終的目標文件。

3、如果main文件不存在,或是main所依賴的後面的 .o 文件的文件修改時間要比main這個文件新,那麼,它就會執行後面所定義的命令來生成main這個文件。

4、如果main所依賴的.o文件也不存在,那麼make會在當前文件中找目標爲.o文件的依賴性,如果找到則再根據那一個規則生成.o文件。(這有點像一個堆棧的過程)

5、當然,你的C文件和H文件是存在的啦,於是make會生成 .o 文件,然後再用 .o
文件生命make的終極任務,也就是執行文件main了。

這就是整個make的依賴性,make會一層又一層地去找文件的依賴關係,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最後被依賴的文件找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管文件的依賴性,即如果在我找了依賴關係之後,冒號後面的文件還是不在,那麼對不起,我就不工作啦。

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