帶你掌握Linux專案自動化構建工具Makefile make

2022-01-24 19:01:07
本篇文章給大家帶來了linux中專案自動化構建工具,在現實生活中我們進行某一項功能往往不能僅僅依賴於一個檔案的程式碼進行操作,需要多個不同的版塊進行組合實現,這個時候需要構建成一個專案,將所有的模組打包組合實現最終功能。希望對大家有幫助。

Makefile

Makefile是一個文字檔案,記錄一個專案的構建規則流程。在工作中會不會寫makefile,從一個側面說明了一個人是否具備完成大型工程的能力,同時一個工程中的原始檔不計數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,其帶來的好處就是——「自動化編譯」,一旦寫好,只需要一個make命令,整個工程完全自動編
譯,極大的提高了軟體開發的效率。

make

make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一
種在工程方面的編譯方法。make是一條命令,makefile是一個檔案,兩個搭配使用,完成專案自動化構建。

工作原理

在Makefile中會形成各個檔案之間的依賴關係,比如一個code.exe是在code.o 的基礎上通過連結生成的,而code.o是在code.s的基礎上通過組合形成的,code.s是在code.i的基礎上通過編譯生成,code.i是在code.c的基礎上預處理完成之後生成,如此層層尋找源頭。其規則使用倒敘的方法,將第一個檔案視作最後完後的檔案,若當前檔案未生成則通過依賴關係以及相互生成的方法進行層層推進,最終完成全部檔案的形成。
依賴關係

A:B   A是依賴於B

依賴方法

gcc 選項 + B -o +A   A是B經過處理生成的檔案

專案清理

工程是需要被清理的,像clean這種,沒有被第一個目標檔案直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,我們可以顯示要make執行。即命令——「make clean」,以此來清除所有的目標檔案,以便重編譯。但是一般我們這種clean的目標檔案,我們將它設定為偽目標,用 .PHONY 修飾,偽目標的特性是,總是被
執行的。

原理

make會在當前目錄下找名字叫「Makefile」或「makefile」的檔案。

如果找到,它會找檔案中內容中的第一個檔案,並把這個檔案作為最終的目標檔案。

如果該檔案當前不存在,或是該檔案的依賴檔案的修改時間要比當前這個檔案要新,那麼,他就會執行後面所定義的命令來生成當前檔案。

如果該檔案的依賴檔案不存在,那麼便對這個依賴檔案進行如同第2,3步的步驟,知道找到最後的原始檔為止

當然,你的C檔案和H檔案是存在的啦,於是make會生成 .o 檔案,然後再用 .o 檔案宣告make的終極任務,也就是執行檔案了。

這就是整個make的依賴性,make會一層又一層地去找檔案的依賴關係,直到最終編譯出第一個目標檔案。

在找尋的過程中,如果出現錯誤,比如最後被依賴的檔案找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。

make只管檔案的依賴性,即,如果在我找了依賴關係之後,冒號後面的檔案還是不在,那麼對不起,我就不工作啦。

make 每次在Makefile中只會找到第一個目標物件進行生成,生成之後就會退出(不會生成第二個物件)

.PHONY: clean

clear:

  rm -rf $(obj)

【補充】

1.預定義變數的使用:[$@ ]、[ $^]、[ $<],可以用以上三個對檔名進行替換

$@ :表示目標物件

$^:表示所有依賴物件

&<:表示依賴物件的第一個

2. $ (wildcard ./.c)獲取當前目錄下所有的以.c結尾的檔案的檔名稱【例】 src=$(wildcard ./.c)   code: $ (str)

3. $ (patsubst %.c, %.o,$(str))表示將str變數中的.c檔案替換成.o,然後存放在obj變數中。

4. 偽物件:宣告一個目標物件與外部檔案無關,表示每次對這個物件不管是否最新都要重新生成,且不管外部是否能夠存在,都要每次無論如何都執行語句[.PHONY:]

5.程式的編譯過程:一般包含預處理、編譯、組合、連結,但是在實際專案構建中整體分為兩步,即編譯和連結。這樣的好處在於,如果只是修改了一個.c檔案,對於之前的直接對所有.c進行編譯生成可執行程式的過程來說,需要重新編譯所有的.c生成可執行程式,這樣的效率非常低下,因此分為兩步進行操作,先把每個.c都是生成自己的.o,然後再將所有的.o連結在一起,一旦一個.c發生改變只需要對這一個.c進行生成.o之後,替換程式中的指定模組就可以。

例1. 建立一個一般的Makefile

在這裡插入圖片描述

在這裡插入圖片描述

例2. 使用預定義編寫的Makefile

在這裡插入圖片描述

相關推薦:《Linux視訊教學

以上就是帶你掌握Linux專案自動化構建工具Makefile make的詳細內容,更多請關注TW511.COM其它相關文章!