中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

makefile該如何入門

發布時間:2021-12-23 17:01:56 來源:億速云 閱讀:280 作者:柒染 欄目:大數據

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

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

makefile內容的編寫按照如下規則

目標1:依賴1  命令1
目標2:依賴2  命令2
目標3:依賴3  命令3.........................目標N:依賴N            命令N

命令可以是任意的shell語句。多數情況下,命令都是起到了從依賴生成目標的功能。例如從.cpp文件生成.o文件,那么命令一定包括g++和一些編譯參數的完整的編譯命令。
目標1 2 3可以是嵌套依賴的,如果依賴1里包含目標2 目標3,那就是一種嵌套的依賴。也可以是獨立的,例如目標1 2 3就是三個獨立的可執行文件,或者三個動態庫,那么他們之間是可以完全沒有依賴關系的,寫在一個makefile文件里只是便于統一管理。
命令前要以一個tab開頭 。如果使用空格代替tab,執行make命令時會報

[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

執行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中的“目標1”test是個可執行文件,也是最終我們需要的東西。test依賴$(all)這個變量,文件開頭定義了all = test.o,所以test依賴的是test.o,生成test的命令是$(CC) -o test $(all),進行變量替換后就是g++ -o test test.o,是一個我們熟知最基礎的編譯命令。
同理,“目標2”test.o依賴的是test.cpp,生成目標的命令是g++ -c test.cpp。
上面兩個規則完成了從源代碼到可執行文件的編譯。
其實我們直接執行g++ -o test test.cpp就可以生成test了,但這種直接敲命令只適用于代碼文件很少的情況。
即使項目只有5個文件,每次代碼更新都要敲5個編譯命令也是很麻煩的。我們只要編寫一次makefile,之后每次代碼更新,或者代碼文件有增減,都只需要修改makefile對應的一小部分內容,然后執行make就行了。
例如test依賴是100個.o文件,在上面的makefile中我們只要寫一次all = test.o test1.o test2.o ..... test99.o,就把目標test的生成規則表達清楚了。當然下面要寫上100個.o文件的生成規則。
上面說的是按最原始的寫法,實際makefile的編寫有很多技巧使得編寫量大大減少,編譯命令的各種參數選項統一都寫在變量中,模式匹配,特殊符號代碼依賴集、目標集,shell指令在makefile里完成自動查找生成所有文件名,然后替換.cpp為.o的玩法等,都可以大道減少makefile的篇幅。如果打開一個開源C++項目的makefile,會覺得完全看不懂,就是因為里面大量使用各種技巧。但即使我們用最原始辦法也就是第一次編寫麻煩一些,之后維護是很簡單的,因為一個C++項目不會有頻繁的大的變化。
make默認支持makefile和Makefile兩種文件名,所以我們直接執行make。如果我們寫make規則的文件叫test20200806,需要執行的命令是make -f test20200806。
并行make的命令是make -j。可以加快工程編譯速度,對于大規模工程適用。
make會自動推導各個目標的依賴關系,按照依賴關系的順序生成目標文件。
makefile里的“目標3”clear是個偽目標,偽目標后面無文件依賴,make不自動找文件依賴,無法執行后面的命令。要執行偽目標,就要make+為目標名。執行make clear,會執行下面的rm命令,這種命令用來清理項目之前編譯的.o等文件,在需要徹底重新編譯項目時都會執行這個命令。

[root@bogon makefiletest]# make clearrm -f *.o test

如果不執行make clear清理之前的.o文件,make會比較.o和.cpp誰更新,如果依賴文件cpp更新,重新編譯這個.o,否則不重新編譯。

上述內容就是makefile該如何入門,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

濉溪县| 永善县| 土默特右旗| 宁都县| 明溪县| 遵化市| 略阳县| 巨野县| 蓬安县| 泽州县| 怀宁县| 荥经县| 平塘县| 新和县| 木兰县| 鄢陵县| 民和| 柞水县| 松阳县| 沁阳市| 封丘县| 中山市| 兴国县| 开化县| 永清县| 石柱| 富源县| 民权县| 瑞安市| 瑞丽市| 绥宁县| 铁岭县| 巫溪县| 溧水县| 临夏县| 上饶县| 新竹市| 镇平县| 琼结县| 宝坻区| 南京市|