本篇文章為大家展示了makefile該如何入門(mén),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
辰溪網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),辰溪網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為辰溪1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的辰溪做網(wǎng)站的公司定做!
makefile文件是用來(lái)幫助編譯和管理C++項(xiàng)目代碼的,需要配合make命令使用。makefile里也可以執(zhí)行其它shell操作,具備一部分.sh腳本的功能。
makefile內(nèi)容的編寫(xiě)按照如下規(guī)則
目標(biāo)1:依賴1
命令1
目標(biāo)2:依賴2
命令2
目標(biāo)3:依賴3
命令3
.........................
目標(biāo)N:依賴N
命令N
命令可以是任意的shell語(yǔ)句。多數(shù)情況下,命令都是起到了從依賴生成目標(biāo)的功能。例如從.cpp文件生成.o文件,那么命令一定包括g++和一些編譯參數(shù)的完整的編譯命令。
目標(biāo)1 2 3可以是嵌套依賴的,如果依賴1里包含目標(biāo)2 目標(biāo)3,那就是一種嵌套的依賴。也可以是獨(dú)立的,例如目標(biāo)1 2 3就是三個(gè)獨(dú)立的可執(zhí)行文件,或者三個(gè)動(dòng)態(tài)庫(kù),那么他們之間是可以完全沒(méi)有依賴關(guān)系的,寫(xiě)在一個(gè)makefile文件里只是便于統(tǒng)一管理。
命令前要以一個(gè)tab開(kāi)頭 。如果使用空格代替tab,執(zhí)行make命令時(shí)會(huì)報(bào)
[root@localhost makefiletest]# makemakefile:5: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.
以下面簡(jiǎn)單的C++代碼為例,說(shuō)明makefile的具體使用。
源代碼文件test.cpp
#include <string>
#include <iostream>
#include<iomanip>
int main(int argc, char** argv)
{
using namespace std;
int i =1 ;
int j = 2;
j += 3;
cout << j<<endl;
}
makefile文件,文件就是makefile
CC=g++
all = test.o
test: $(all)
$(CC) -o test $(all)
test.o: ./test.cpp
$(CC) -c test.cpp
clear:
rm -f *.o test
執(zhí)行make命令
[root@localhost makefiletest]# makeg++ -c test.cppg++ -o test test.o[root@localhost makefiletest]# ls -lrttotal 24-rw-r--r--. 1 root root 196 Aug 6 11:00 test.cpp-rw-r--r--. 1 root root 120 Aug 6 11:04 makefile-rw-r--r--. 1 root root 2328 Aug 6 11:04 test.o-rwxr-xr-x. 1 root root 8840 Aug 6 11:04 test
正確生成了test test.o
makefile中的“目標(biāo)1”test是個(gè)可執(zhí)行文件,也是最終我們需要的東西。test依賴$(all)這個(gè)變量,文件開(kāi)頭定義了all = test.o,所以test依賴的是test.o,生成test的命令是$(CC) -o test $(all),進(jìn)行變量替換后就是g++ -o test test.o,是一個(gè)我們熟知最基礎(chǔ)的編譯命令。
同理,“目標(biāo)2”test.o依賴的是test.cpp,生成目標(biāo)的命令是g++ -c test.cpp。
上面兩個(gè)規(guī)則完成了從源代碼到可執(zhí)行文件的編譯。
其實(shí)我們直接執(zhí)行g(shù)++ -o test test.cpp就可以生成test了,但這種直接敲命令只適用于代碼文件很少的情況。
即使項(xiàng)目只有5個(gè)文件,每次代碼更新都要敲5個(gè)編譯命令也是很麻煩的。我們只要編寫(xiě)一次makefile,之后每次代碼更新,或者代碼文件有增減,都只需要修改makefile對(duì)應(yīng)的一小部分內(nèi)容,然后執(zhí)行make就行了。
例如test依賴是100個(gè).o文件,在上面的makefile中我們只要寫(xiě)一次all = test.o test1.o test2.o ..... test99.o,就把目標(biāo)test的生成規(guī)則表達(dá)清楚了。當(dāng)然下面要寫(xiě)上100個(gè).o文件的生成規(guī)則。
上面說(shuō)的是按最原始的寫(xiě)法,實(shí)際makefile的編寫(xiě)有很多技巧使得編寫(xiě)量大大減少,編譯命令的各種參數(shù)選項(xiàng)統(tǒng)一都寫(xiě)在變量中,模式匹配,特殊符號(hào)代碼依賴集、目標(biāo)集,shell指令在makefile里完成自動(dòng)查找生成所有文件名,然后替換.cpp為.o的玩法等,都可以大道減少makefile的篇幅。如果打開(kāi)一個(gè)開(kāi)源C++項(xiàng)目的makefile,會(huì)覺(jué)得完全看不懂,就是因?yàn)槔锩娲罅渴褂酶鞣N技巧。但即使我們用最原始辦法也就是第一次編寫(xiě)麻煩一些,之后維護(hù)是很簡(jiǎn)單的,因?yàn)橐粋€(gè)C++項(xiàng)目不會(huì)有頻繁的大的變化。
make默認(rèn)支持makefile和Makefile兩種文件名,所以我們直接執(zhí)行make。如果我們寫(xiě)make規(guī)則的文件叫test20200806,需要執(zhí)行的命令是make -f test20200806。
并行make的命令是make -j。可以加快工程編譯速度,對(duì)于大規(guī)模工程適用。
make會(huì)自動(dòng)推導(dǎo)各個(gè)目標(biāo)的依賴關(guān)系,按照依賴關(guān)系的順序生成目標(biāo)文件。
makefile里的“目標(biāo)3”clear是個(gè)偽目標(biāo),偽目標(biāo)后面無(wú)文件依賴,make不自動(dòng)找文件依賴,無(wú)法執(zhí)行后面的命令。要執(zhí)行偽目標(biāo),就要make+為目標(biāo)名。執(zhí)行make clear,會(huì)執(zhí)行下面的rm命令,這種命令用來(lái)清理項(xiàng)目之前編譯的.o等文件,在需要徹底重新編譯項(xiàng)目時(shí)都會(huì)執(zhí)行這個(gè)命令。
[root@bogon makefiletest]# make clearrm -f *.o test
如果不執(zhí)行make clear清理之前的.o文件,make會(huì)比較.o和.cpp誰(shuí)更新,如果依賴文件cpp更新,重新編譯這個(gè).o,否則不重新編譯。
上述內(nèi)容就是makefile該如何入門(mén),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享名稱:makefile該如何入門(mén)
瀏覽地址:http://chinadenli.net/article12/ihjcdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、微信小程序、網(wǎng)站內(nèi)鏈、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)