首頁  >  文章  >  運維  >  Linux自動化建置工具make和Makefile怎麼使用

Linux自動化建置工具make和Makefile怎麼使用

王林
王林轉載
2023-05-14 16:22:121782瀏覽

一、make和Makefile的作用

在一個工程中的原始檔案不計數,其按類型、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至要進行更複雜的功能操作。

所以,makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make指令,整個工程完全自動編譯,極大的提高了軟體開發的效率。

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

二、make和Makefile的使用

在了解依賴關係和依賴方法之前,我們來寫一個C語言的小程式。

Linux自動化建置工具make和Makefile怎麼使用

我們建立了一個make.c的文件,並寫上了一句hello make的程式碼。

那我們再建立一個Makefile檔(makefile也可以,但不建議)。

然後我們編輯Makefile檔案並寫如下程式碼:

Linux自動化建置工具make和Makefile怎麼使用

然後我們儲存退出。

然後我們可以執行make指令。如果提示make不存在,則是因為沒有安裝,可以切換至root身分安裝。安裝程式碼:yum install makesudo install make

正常執行make後會出現如下顯示。

Linux自動化建置工具make和Makefile怎麼使用

然後我們ll來查看目前目錄下的檔案。

我們可以發現多了一個可執行程式make。那我們運行用 ./make 運行試試。

Linux自動化建置工具make和Makefile怎麼使用

我們會發現這個可執行程式輸出make。

這就是我們的自動化建置工具,只需要在Makefile裡面設定一下。往後直接輸入make即可編譯程式碼。那我們再輸入一次make試試。

Linux自動化建置工具make和Makefile怎麼使用

提示我們 make程式是最新的。也就是說,如果你沒有修改或更新程式的話。那就不會為你編譯,因為你程式都沒動呀,編譯它幹嘛。

那麼此時我們回過來分析 Makefile裡面寫的程式碼。

Linux自動化建置工具make和Makefile怎麼使用

首先我們把它分成三個部分

make

make.c

gcc make.c -o make -std=c99

#這三者的關係就是,make 是依賴make .c 產生的。它們兩者有依賴關係 ,而gcc make.c -o make -std=c99則是make 依賴make.c的方法,叫做依賴方法

什麼是依賴關係和依賴方法?

打個比方。

月底了,你的生活費用光了。這時候你打電話給你爸爸,跟他說:「爸,月底了。我沒錢了。」。此時你的爸爸就知道了,會給你打生活費。這裡面,你和你的父親是父子關係,所以你依賴你的父親,你們之間有依賴關係。而你的父親給你生活費,這是你依賴父親的一種方式,所以這就是依賴方法。如果此時你打電話給你室友的父親要生活費,他會直接讓你滾。因為你們根本不構成依賴關係,不構成依賴關係就沒有依賴方法。

Linux自動化建置工具make和Makefile怎麼使用

所以我的程式也是一樣的。 make 是產生的可執行程式。而它依賴make.c,因為它是從 make.c編譯來的。而依賴方法則是 執行 gcc make.c -o make -std=c99 這條指令。

依賴關係的原理

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

  • 如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到「hello」這個文件, 並把這個文件作為最終的目標文件。

  • 如果hello檔案不存在,或是hello所依賴的後面的test.o檔案的檔案修改時間要比test這個檔案新(可以用touch 測試),那麼,他就會執行後面定義的指令來產生test這個檔。

  • 如果test所依賴的test.o檔案不存在,那麼make會在目前檔案中找目標為test.o檔案的依賴性,如果找到則再根據那一個規則產生test.o檔。 (這有點像是堆疊的過程)

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

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

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

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

清理

我們平常在寫程式碼的時候,常常會需要重複編譯,執行程式碼。

而在下次重新編譯之前,需要先清理一下上次產生的可執行程式。但是清理的時候可能清理錯誤,不小心把原始檔刪了,這又造成了問題。

那我們有沒有方法解決呢?答案是當然有。

我們繼續編輯Makefile檔。

Linux自動化建置工具make和Makefile怎麼使用

我們在原有的基礎上加上了

.PHONY:clean

clean:

	rm -f make

那麼.PHONY有什麼作用呢?

.PHONY修飾的是一個偽目標的,偽目標總是被執行的。 clean是自己定義的一條make指令,使用方法為make clean

那我們來試試這條指令

Linux自動化建置工具make和Makefile怎麼使用

我們可以看到它被清理了,那為什麼說偽目標它總是被執行的呢?我們多次執行它看看。

Linux自動化建置工具make和Makefile怎麼使用

我們可以一直執行它,那我們多次執行make呢?

Linux自動化建置工具make和Makefile怎麼使用

我們會發現,make執行了一次,就無法執行了,因為沒有被.PHONY修飾。那我用.PHONY修飾它再試試。

Linux自動化建置工具make和Makefile怎麼使用

然後我們儲存退出,多次執行make

Linux自動化建置工具make和Makefile怎麼使用

#我們可以看到它被多次執行了。但我覺得沒有這個必要,因為文件沒有被修改的話。重新編譯沒有意義,所以自動化編譯不建議加上.PHONY

我們儲存退出,多次執行make

Linux自動化建置工具make和Makefile怎麼使用

我們就可以看到它被執行多次了。但我覺得沒有這個必要,因為文件沒有被修改的話。重新編譯沒有意義,所以自動化編譯不建議加上.PHONY

#

以上是Linux自動化建置工具make和Makefile怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除