??博客主頁:小智_x0___0x_
??歡迎關(guān)注:??點贊??收藏??留言
??系列專欄:Linux入門到精通
??代碼倉庫:小智的代碼倉庫
什么是make/makefile?
- 一個工程中的源文件不計數(shù),其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復(fù)雜的功能操作。
- makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編 譯,極大的提高了軟件開發(fā)的效率。
- make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數(shù)的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make??梢?,makefile都成為了一種在工程方面的編譯方法。
- make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構(gòu)建
make/makefile的使用
我們之前編譯程序要使用gcc/g++的各種指令來進行編譯>
比如我們建立一個mycode.c:
在沒有學(xué)習(xí)make/makefile之前我們想要編譯這段代碼需要使用這行指令gcc -o mycode mycode.c
我們編譯來看:
可以看到程序可以被編譯執(zhí)行。
我們再來使用make/makefile來進行操作:
- 首先創(chuàng)建一個空白文件makefile/Makefile(首字母大小寫都可以):
- 使用vim編輯器打開文件:
在文件中寫入這些代碼,保存并退出。 - 終端輸入make進行代碼編譯:
可以看到使用make指令,也可以對代碼進行編譯,也不用我們每次都去敲那么長的gcc指令,而且還很容易敲錯。 - 使用make clean對項目進行清理。
可以看到的確清理了我們生成的可執(zhí)行程序。
依賴關(guān)系
我們來看makefile中的內(nèi)容:
第一行就代表依賴關(guān)系,意思就是mycode的生成要依賴于mycode.c
。
這里舉個例子:
小李到了月末給他自己的父親打了個電話要生活費。
小李為什么要給他父親打電話而不是給他室友的父親打電話要生活費呢,這是因為,小李和他父親是依賴關(guān)系,小李依賴于他的父親,而小李跟他室友的父親沒有任何關(guān)系。
依賴方法
這一行縮進的就代表依賴方法,意思是要執(zhí)行的指令。
再使用上面的例子進行解釋就是:
小李打電話提到的要生活費就是打電話的主要目的,而實行要生活費的這個操作就是依賴方法。
makefile是如何工作的?
我們把上篇學(xué)到的預(yù)處理編譯鏈接的過程也加到makefile中,再來使用make
指令>
可以看到他也生成了對應(yīng)的文件,而且我們上面也沒有按照程序的執(zhí)行順序來寫,makefile也可以幫我們完成,這可以說明make會自動推導(dǎo)makefile中的依賴關(guān)系
。
那如果我們再makefile中刪去一行指令那么程序還可以繼續(xù)正常執(zhí)行嗎?
我們來試試看>
可以看到給我們報錯說要產(chǎn)生mycode.o需要依賴mycode.s,而我們剛剛正好刪除了生成mycode.s文件的那兩行代碼
為什么要使用makefile呢?
使用Makefile的主要目的是為了自動化構(gòu)建和管理項目。Makefile是一個文本文件,其中包含了一系列規(guī)則和命令,用于告訴構(gòu)建工具如何編譯、鏈接和生成項目中的各個組件。
下面是使用Makefile的幾個重要原因:
-
自動化構(gòu)建:Makefile可以定義一系列構(gòu)建規(guī)則和依賴關(guān)系,使得整個項目的構(gòu)建過程變得自動化。通過運行
make
命令,構(gòu)建工具會根據(jù)Makefile中定義的規(guī)則判斷需要重新編譯哪些文件,并自動執(zhí)行相應(yīng)的編譯、鏈接操作,從而減少手動操作和避免人為錯誤。 -
管理復(fù)雜的項目:在大型項目中,可能涉及多個源文件、庫文件和配置文件之間的復(fù)雜依賴關(guān)系。Makefile可以讓您清晰地定義這些依賴關(guān)系,確保正確的文件被編譯和鏈接,以及正確的文件被重建。
-
跨平臺使用:Makefile是跨平臺的構(gòu)建工具,可以在不同的操作系統(tǒng)上使用。它支持各種編程語言和開發(fā)環(huán)境,使得項目在不同平臺上具有一致的構(gòu)建方式。
-
增量編譯:Makefile利用文件的時間戳來確定是否需要重新編譯某個文件。只有當文件的依賴發(fā)生變化或文件本身被修改時,相關(guān)的規(guī)則才會重新執(zhí)行。這種增量編譯的機制可以大幅提升項目的構(gòu)建效率,避免不必要的重復(fù)工作。
-
高度可定制:Makefile具有很高的靈活性和可定制性。您可以根據(jù)項目的需求定義自己的規(guī)則和命令,滿足特定的構(gòu)建和部署需求。您還可以輕松地擴展Makefile,添加新的目標、參數(shù)或規(guī)則,以適應(yīng)項目的變化。
綜上所述,使用Makefile可以提高項目的開發(fā)效率、降低出錯的可能性,簡化構(gòu)建過程并實現(xiàn)自動化管理,特別適用于較大、復(fù)雜的軟件項目。
makefile是怎么做到的呢?
我們再來使用make來編譯源代碼:
我們再在已經(jīng)編譯的基礎(chǔ)上再次使用make指令>
可以看到make拒絕的我的操作。這是因為生成的可執(zhí)行程序是最新的。
一定是源文件形成的可執(zhí)行,先有源文件,才有可執(zhí)行,一般而言,源文件的最近修改時間 比可執(zhí)行修改時間要老的!
如果我更改了源文件,歷史上曾經(jīng)還有可執(zhí)行程序,那么源文件的修改時間,一定是比可執(zhí)行程序要新的,這是我們再使用make就可以完成代碼的編譯。
因此只需要比較可執(zhí)行程序的修改時間 和 源文件的修改時間
- .exe 新于 .c 源文件是老的,不需要重新編譯
- .exe 老于 .c 源文件是新的,需要重新編譯
一般而言.exe!=.c
。
這里有一個stat指令
可以查看文件所對應(yīng)的時間
-
Access(訪問):表示獲取或讀取數(shù)據(jù)或文件的操作。當您執(zhí)行訪問操作時,您可以查看或檢索數(shù)據(jù)的內(nèi)容或狀態(tài),而不會改變其原始內(nèi)容。例如,訪問一個文件可以讀取文件的內(nèi)容或元數(shù)據(jù),但不會對文件進行修改。
-
Modify(修改):表示對數(shù)據(jù)或文件進行更改的操作。當您執(zhí)行修改操作時,您會對數(shù)據(jù)或文件進行更改,以更新其內(nèi)容或狀態(tài)。這可能涉及編輯、添加、刪除等操作,以使數(shù)據(jù)或文件發(fā)生變化。例如,修改一個文本文件可以編輯文件的內(nèi)容并保存修改后的版本。
-
Change(變更):是一個更廣泛的術(shù)語,通常用于表示對數(shù)據(jù)或文件進行任何形式的更改。它可以包括訪問和修改以及其他操作。"Change"一詞沒有具體指明執(zhí)行了哪些操作,因此具體操作的含義可能需要根據(jù)上下文來確定。
make會根據(jù)源文件的新舊和目標文件的新舊(根據(jù)Modify時間進行比較
),判定是否需要重新執(zhí)行依賴關(guān)系進行編譯。
make和make clean
為什么使用make可以直接執(zhí)行源文件編譯操作,而項目清理需要使用makefile呢?
我們來吧兩個順序顛倒一下試試看:
通過這個例子我們可以得出make指令的操作是執(zhí)行makefile中的第一個依賴關(guān)系。
.PHONY:偽目標
通過上面我們可以了解到依賴關(guān)系不一定總是執(zhí)行的,那如果我們想讓依賴關(guān)系總是執(zhí)行呢?
這里可以通過.PHONY:偽目標
具體使用方法:
這就好比我們告訴makefile以后遇到mycode就不要阻攔了,讓他直接操作。
這個一般多用于修飾clean:
特殊符號
makefile中可以簡寫可以使用 $@ 代替要生成的目標文件,用 $^代表目標文件:
如果執(zhí)行make或者make clean
之后不想看到指令回顯可以在指令前面加上@修飾:文章來源:http://www.zghlxwxcb.cn/news/detail-524427.html
??小結(jié)??
今天我們學(xué)習(xí)了Linux項目自動化構(gòu)建工具-make/makefile
相信大家看完有一定的收獲。種一棵樹的最好時間是十年前,其次是現(xiàn)在!
把握好當下,合理利用時間努力奮斗,相信大家一定會實現(xiàn)自己的目標!加油!創(chuàng)作不易,辛苦各位小伙伴們動動小手,三連一波????~~~
,本文中也有不足之處,歡迎各位隨時私信點評指正!文章來源地址http://www.zghlxwxcb.cn/news/detail-524427.html
到了這里,關(guān)于【Linux】Linux項目自動化構(gòu)建工具-make/makefile的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!