前言:
本章主要內(nèi)容有認(rèn)識(shí)與學(xué)習(xí)Linux
環(huán)境下如何使用項(xiàng)目自動(dòng)化構(gòu)建工具——make/makefile
。
一.make與Makefile的關(guān)系
當(dāng)我們編寫一個(gè)較大的軟件項(xiàng)目時(shí),通常需要將多個(gè)源文件編譯成可執(zhí)行程序或庫文件。為了簡化這個(gè)過程,我們可以使用 make
工具和 Makefile
文件。Makefile
文件可以幫助我們自動(dòng)化構(gòu)建和管理軟件項(xiàng)目,從而提高效率和可靠性。它還可以跨平臺(tái)使用,因?yàn)?make
工具可以在各種不同的操作系統(tǒng)和編譯器上運(yùn)行。
1.Makefile
Makefile
文件包含了一系列規(guī)則,每個(gè)規(guī)則描述了如何從源文件生成目標(biāo)文件。在每個(gè)規(guī)則中,我們定義了目標(biāo)文件和其依賴關(guān)系,并且指定了需要執(zhí)行的命令。
示例:
創(chuàng)建一個(gè)新文件 Makefile
:
touch Makefile
編輯 Makefile
文件:
//vim進(jìn)行編輯
vim Makefile
//寫入內(nèi)容
Test : Test.c
gcc Test.c -o Test
//保存退出
這樣就寫好了一個(gè)Makefile
文件 了,那么這樣寫有什么含義呢?
其實(shí)每個(gè) Makefile
文件存在的意義就是生成一個(gè)最終目標(biāo)文件,而 Makefile
文件里最開始的文件就被認(rèn)定為是最終目標(biāo)文件(示例中的Test
文件)。
示例中,要想生成目標(biāo)文件 Test
,我們需要通過 Test.c
文件經(jīng)過編譯后生成目標(biāo)文件 Test
。所以Test.c
與 Test
產(chǎn)生了依賴關(guān)系,用 :
表示。而接下來的 gcc Test.c -o Test
這條指令就是解釋目標(biāo)文件 Test
需要和 test.c
產(chǎn)生怎樣的關(guān)系。
當(dāng)然依賴關(guān)系有時(shí)候也可以不存在。因?yàn)?code> make 的目的是產(chǎn)生目標(biāo)文件,不用管通過什么手段,也不管有沒有目標(biāo)文件,例如:
//沒有依賴關(guān)系的示例
Test :
touch Test
有的時(shí)候,一個(gè)依賴關(guān)系可能不足以生成最終目標(biāo)文件,此時(shí)我們還需建立多層依賴關(guān)系,例如:
Test : test.o
gcc test.o -o Test
test.o : test.s
gcc -c test.s -o test.o
test.s : test.i
gcc -S test.i -o test.s
test.i : Test.c
gcc -E Test.c -o test.i
為了生成最終的目標(biāo)文件Test
,系統(tǒng)會(huì)根據(jù)依賴關(guān)系一層一層的尋找下去。如上例,要生成Test
,就得找到 test.o
,要生成 test.o
就要生成 test.s
…,在這樣一層一層的尋找的時(shí)候,如果有哪個(gè)過程中出現(xiàn)了斷層(生成目標(biāo)文件失?。?,則會(huì)出現(xiàn)報(bào)錯(cuò)。
上個(gè)示例結(jié)果如下,make
指令執(zhí)行 Makefile
后,不僅最終目標(biāo)文件生成了,過程中的目標(biāo)文件也都會(huì)生成:
明白了Makefile
是什么之后,再來看一看make
指令。
2.make
make
是一條指令,它與Makefile
相伴相生。
當(dāng)我們執(zhí)行 make
指令時(shí),make
工具會(huì)讀取 Makefile
文件,并根據(jù)其中的規(guī)則來生成目標(biāo)文件。它會(huì)檢查每個(gè)規(guī)則中的依賴關(guān)系和目標(biāo)文件的最新修改時(shí)間,從而決定哪些規(guī)則需要執(zhí)行。
通俗講就是,系統(tǒng)為了效率,并不會(huì)對(duì)已經(jīng)生成的目標(biāo)文件或未曾改動(dòng)的目標(biāo)文件再作復(fù)雜的編譯并重新生成。
它會(huì)檢查源文件與可執(zhí)行文件最近修改時(shí)間的新舊,判斷是否進(jìn)行編譯。
當(dāng)我們只輸入 make
指令時(shí),它會(huì)默認(rèn)最終目標(biāo)文件。倘若我們只是想生成過程中的某一個(gè)目標(biāo)文件,則需要指定該文件名。例如:只需生成 test.o
即可:
Test : test.o
gcc test.o -o Test
test.o : test.s
gcc -c test.s -o test.o
test.s : test.i
gcc -S test.i -o test.s
test.i : Test.c
gcc -E Test.c -o test.i
make test.o
二.項(xiàng)目清理
1.clean
在 Makefile
中,一般還會(huì)加入一個(gè)目標(biāo)文件 clean
且用 .PHONY
修飾 ,其作用是清理生成項(xiàng)目文件。例如:
Test : test.o
gcc test.o -o Test
test.o : test.s
gcc -c test.s -o test.o
test.s : test.i
gcc -S test.i -o test.s
test.i : Test.c
gcc -E Test.c -o test.i
.PHONY : clean
clean :
rm -f Test test.i test.s test.o
2. .PHONY
被 .PHONY
修飾的目標(biāo)文件意為 總是被執(zhí)行的。例如,我們執(zhí)行 make test.o
命令后,可以執(zhí)行,但是第二次卻不行了,因?yàn)樵撃繕?biāo)文件已經(jīng)存在且為最新。但是被.PHONY
飾后可以一直被執(zhí)行。
文章來源:http://www.zghlxwxcb.cn/news/detail-533942.html
本文到此結(jié)束,碼文不易,還請(qǐng)多多支持哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-533942.html
到了這里,關(guān)于Linux:項(xiàng)目自動(dòng)化構(gòu)建工具——make/Makefile的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!