Linux?自動(dòng)化構(gòu)建工具make/Makefile的使用詳解
VS中有一鍵編譯+自動(dòng)運(yùn)行,Linux也給我們提供了對(duì)應(yīng)的編譯方式,雖然不及VS那么便捷,但是相比于手動(dòng)輸入 gcc -o add add.c ,我們一句make就可以搞定
Makefile是一個(gè)文件,能夠存放上述 gcc -o add add.c 這種編譯指令
make是一個(gè)命令工具,能夠解釋Makefile中的指令
要如何編譯.c文件,關(guān)鍵就在于Makefile是怎么寫的,下面我們主要介紹這兩者的使用
一、單個(gè)文件的編譯
假設(shè)我們要編譯這么一個(gè)test.c文件,我們希望編譯生成一個(gè)名為test的可執(zhí)行文件

我們?cè)趖est.c所在目錄下創(chuàng)建一個(gè)Makefile文件,這里有兩種編譯寫法
1、寫法一:逐個(gè)生成.i、.s、.o文件,最后再生成 test執(zhí)行文件
先一步步向下分析,需要什么依賴文件,然后再一步步生成

編寫好以后,我們只需要在命令行輸入make,系統(tǒng)就會(huì)幫我們自動(dòng)編譯了,同時(shí)會(huì)生成每一步產(chǎn)生的文件按

2、 寫法二:一步到位,直接通過 test.c 生成 test 執(zhí)行文件(推薦)
Makefile中要寫的內(nèi)容如下

第一行:確定好依賴文件和目標(biāo)文件。也就是要用依賴文件來生成目標(biāo)文件
第二行:編譯指令。
$@ 指向第一行的目標(biāo)文件,表示目標(biāo)文件test
$^ 指向第一行的依賴文件,表示依賴文件test.c
-std 表示采用的C++標(biāo)準(zhǔn)
接下來我們只需要在命令行輸入make,系統(tǒng)就會(huì)幫我們編譯了,編譯成功以后,當(dāng)前目錄下就會(huì)多出一個(gè)test 執(zhí)行文件


3、 Makefile自動(dòng)清理
我們每次開始編譯之前,我們最好先清理一下之前生成的執(zhí)行文件,手動(dòng)輸入 rm test 有點(diǎn)太麻煩了,Makefile只要寫入下面的內(nèi)容,就會(huì)自動(dòng)幫我們清理了

如果我們還希望移除生成的.o 、.s、.i文件,那么第6行只要換成
rm -f test test.o test.s test.i
一般我們make的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用,當(dāng)然也可以手動(dòng)調(diào)用,如


我們會(huì)發(fā)現(xiàn)之前的test執(zhí)行文件不見了
二、多個(gè)文件的編譯(同一目錄下)
現(xiàn)在我們有三個(gè)文件,分別是test.c、sub.c、sub.h,而且我們要在test.c中調(diào)用sub.h中的函數(shù)


Makefile中的內(nèi)容如下:

test執(zhí)行文件 要依賴 多個(gè)文件生成的 .o文件,現(xiàn)在沒有 .o文件,所以需要重新生成 .o文件
當(dāng)前路徑下有多個(gè).c文件,我們逐個(gè)去寫的話,就是
test.o:test.c
gcc -c $@ $^
sub.o:sub.c
gcc -c $@ $^但是這樣寫太復(fù)雜了,我們可以選擇下面這種寫法
%.o: %.c
gcc -c $<%.o:表示目標(biāo)文件是 .o文件
%.c:表示依賴文件是當(dāng)前路徑下的 .c文件,可以看作是一個(gè)集合中放著 test.c sub.c
$< : 展開%.c ,逐個(gè)生成對(duì)應(yīng)的 .o文件,比如test.c就會(huì)生成對(duì)應(yīng)的test.o、sub.c就會(huì)生成對(duì)應(yīng)的
sub.o
現(xiàn)在我們來運(yùn)行一下


三、多個(gè)文件的編譯(不同目錄下)
現(xiàn)在我們有三個(gè)文件,test.c、sub.h、sub.c,但是其中sub.h、sub.c在其目錄func_dir 下



Makefile的內(nèi)容如下:

現(xiàn)在我們來運(yùn)行一下試試


到此這篇關(guān)于Linux 自動(dòng)化構(gòu)建工具 make/Makefile的文章就介紹到這了,更多相關(guān)linux自動(dòng)化構(gòu)建工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
linux 環(huán)境 mysql寫入中文報(bào)錯(cuò)
本篇文章主要介紹了linux 環(huán)境 mysql寫入中文報(bào)錯(cuò)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04
shell腳本中使用iconv實(shí)現(xiàn)批量文件轉(zhuǎn)碼的代碼分享
這篇文章主要介紹了shell腳本中使用iconv實(shí)現(xiàn)批量文件轉(zhuǎn)碼的代碼分享,本文提供了2個(gè)實(shí)現(xiàn)代碼和各自使用方法,需要的朋友可以參考下2014-08-08
提取oralce當(dāng)天的alert log的shell腳本代碼
提取oralce當(dāng)天的alert log的shell腳本代碼,需要的朋友可以參考下2013-02-02
shell Bash的數(shù)組與關(guān)聯(lián)數(shù)組的實(shí)現(xiàn)
本文主要介紹了shell Bash的數(shù)組與關(guān)聯(lián)數(shù)組的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
使用shell腳本對(duì)Nginx日志進(jìn)行切分的示例代碼
本篇文章主要介紹了使用shell腳本對(duì)Nginx日志進(jìn)行切分的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08

