溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

makefile該如何入門

發(fā)布時(shí)間:2021-12-23 17:01:56 來源:億速云 閱讀:270 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了makefile該如何入門,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

makefile文件是用來幫助編譯和管理C++項(xiàng)目代碼的,需要配合make命令使用。makefile里也可以執(zhí)行其它shell操作,具備一部分.sh腳本的功能。

makefile內(nèi)容的編寫按照如下規(guī)則

目標(biāo)1:依賴1  命令1
目標(biāo)2:依賴2  命令2
目標(biāo)3:依賴3  命令3.........................目標(biāo)N:依賴N            命令N

命令可以是任意的shell語句。多數(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)庫,那么他們之間是可以完全沒有依賴關(guān)系的,寫在一個(gè)makefile文件里只是便于統(tǒng)一管理。
命令前要以一個(gè)tab開頭 。如果使用空格代替tab,執(zhí)行make命令時(shí)會(huì)報(bào)

[root@localhost makefiletest]# makemakefile:5: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

以下面簡單的C++代碼為例,說明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è)變量,文件開頭定義了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è)編譯命令也是很麻煩的。我們只要編寫一次makefile,之后每次代碼更新,或者代碼文件有增減,都只需要修改makefile對(duì)應(yīng)的一小部分內(nèi)容,然后執(zhí)行make就行了。
例如test依賴是100個(gè).o文件,在上面的makefile中我們只要寫一次all = test.o test1.o test2.o ..... test99.o,就把目標(biāo)test的生成規(guī)則表達(dá)清楚了。當(dāng)然下面要寫上100個(gè).o文件的生成規(guī)則。
上面說的是按最原始的寫法,實(shí)際makefile的編寫有很多技巧使得編寫量大大減少,編譯命令的各種參數(shù)選項(xiàng)統(tǒng)一都寫在變量中,模式匹配,特殊符號(hào)代碼依賴集、目標(biāo)集,shell指令在makefile里完成自動(dòng)查找生成所有文件名,然后替換.cpp為.o的玩法等,都可以大道減少makefile的篇幅。如果打開一個(gè)開源C++項(xiàng)目的makefile,會(huì)覺得完全看不懂,就是因?yàn)槔锩娲罅渴褂酶鞣N技巧。但即使我們用最原始辦法也就是第一次編寫麻煩一些,之后維護(hù)是很簡單的,因?yàn)橐粋€(gè)C++項(xiàng)目不會(huì)有頻繁的大的變化。
make默認(rèn)支持makefile和Makefile兩種文件名,所以我們直接執(zhí)行make。如果我們寫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)后面無文件依賴,make不自動(dòng)找文件依賴,無法執(zhí)行后面的命令。要執(zhí)行偽目標(biāo),就要make+為目標(biāo)名。執(zhí)行make clear,會(huì)執(zhí)行下面的rm命令,這種命令用來清理項(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誰更新,如果依賴文件cpp更新,重新編譯這個(gè).o,否則不重新編譯。

上述內(nèi)容就是makefile該如何入門,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI