最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux下Makefile的編寫與使用詳解

 更新時(shí)間:2021年12月13日 09:34:27   作者:Gemini呆瓜  
大家好,本篇文章主要講的是Linux下Makefile的編寫與使用詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

Makefile

一個(gè)工程文件中的源文件可能有很多,并且不同的功能、模塊等都放在不同的目錄中,常規(guī)的編譯已經(jīng)不能高效化的處理這樣的問題,而Makefile就是為解決這一問題而來。

Makefile一旦寫好,只需一個(gè)make指令,即可完成Makefile文件中所編寫的所有指令,從而編譯整個(gè)工程文件,極大的提高了效率。

make是一個(gè)命令工具,用來解釋Makefile中的命令。

Makefile文件命名和規(guī)則

文件命名

采用makefile或Makefile都可。

Makefile規(guī)則

Makefile中的命令規(guī)則如下:

xxx(目標(biāo)文件):xxx(依賴文件)
制表符)命令(shell命令)
其中,目標(biāo)文件即最終要生成的文件(偽目標(biāo)除外),依賴文件即生成目標(biāo)文件所需的文件,命令即shell命令。

注意,命令前必須有一個(gè)tab縮進(jìn)。

例如:

#Makefile
app: a.c b.c #目標(biāo):依賴
	gcc a.c b.c -o app #注意這行最開始的縮進(jìn)

make以上這個(gè)Makefile后就會(huì)將目錄下的a.cb.c編譯為目標(biāo)文件app

Makefile的工作原理

Makefile中的命令在執(zhí)行前,會(huì)檢查是否存在所需的依賴文件

如果存在:執(zhí)行命令

如果不存在:向下檢查其他規(guī)則,是否存在其他規(guī)則生成當(dāng)前規(guī)則所需要的依賴,如果有,則執(zhí)行該規(guī)則中的命令。

例如:

#Makefile
app: a.o b.o
	gcc a.o b.o -o app
a.o: a.c
	gcc -c a.c -o a.o
b.o: b.c
	gcc -c b.c -o b.o

在上方這個(gè)Makefile中,當(dāng)執(zhí)行到app規(guī)則時(shí),會(huì)發(fā)現(xiàn)所需的依賴文件a.o與b.o都不存在于當(dāng)前目錄,所以會(huì)向下尋找是否有其他規(guī)則生成此文件,當(dāng)尋找到a.o規(guī)則時(shí),發(fā)現(xiàn)其是所需的文件,就執(zhí)行g(shù)cc -c a.c -o a.o,b.o同理。

Makefile在執(zhí)行規(guī)則中的命令時(shí),會(huì)比較目標(biāo)文件和依賴文件的修改時(shí)間
如果依賴文件晚于目標(biāo)文件修改時(shí)間,即依賴文件在上一次生成目標(biāo)后進(jìn)行過修改,則會(huì)重新生成目標(biāo)文件。
如果依賴文件早于目標(biāo)文件修改時(shí)間,即依賴文件在上一次生成目標(biāo)后沒進(jìn)行修改,則不會(huì)執(zhí)行相應(yīng)的命令。
例如,你對(duì)一個(gè)Makefile使用兩次make,第二次會(huì)提示make:"app"已是最新。

利用這個(gè)特性,在加上我們將依賴與目標(biāo)分級(jí)生成,即上方第二個(gè)Makefile,這樣當(dāng)我們僅修改其中的a.c文件,再一次make只會(huì)執(zhí)行a.o規(guī)則與app規(guī)則,b.o規(guī)則因?yàn)閎.c未修改而不執(zhí)行,這樣可以大大減少資源浪費(fèi)。

Makefile變量

以上雖然可以減少編譯代碼的重復(fù)量,但是如果一個(gè)工程中有1000個(gè).c .h文件,我們編寫一個(gè)Makefile就會(huì)浪費(fèi)大量時(shí) 間。因此,我們要采用一些變量來提高效率。

變量的獲取
我們使用 $(變量名) 來使用變量。

自定義變量
我們使用 變量名 = 變量值var = hello來自定義我們所需的變量。
例如上方第一個(gè)Makefile就可改寫為:

#Makefile
rsc = a.c b.c
app: $(rsc) #目標(biāo):依賴
	gcc $(rsc) -o app #注意這行最開始的縮進(jìn)

預(yù)定義的變量
有部分變量是系統(tǒng)預(yù)定義的,我們可以直接使用。
AR:歸檔維護(hù)程序的名稱,默認(rèn)值為ar
CC:C編譯器的名稱,默認(rèn)值為cc
CXX:C++編譯器的名稱,默認(rèn)值為g++
$@:目標(biāo)的完整名稱
$<:第一個(gè)依賴文件的名稱
$^:所有依賴文件的名稱

為了方便理解接下來的例子,我們簡(jiǎn)單講解一下Makefile中的模式匹配。
%.o:%.c 中,%是 通配符,匹配一個(gè)字符串,而兩個(gè)%則匹配同一個(gè)字符串。
例如上方第二個(gè)Makefile可改寫為:

#Makefile
rcs = a.o b.o
app: $(rcs)
	$(CC) $(rcs) -o $@
%.o: %.c #上方規(guī)則會(huì)執(zhí)行兩次此規(guī)則
	$(CC) -c $< -o $@

Makefile函數(shù)

我們可以看到,上面這個(gè)Makefile已經(jīng)相對(duì)簡(jiǎn)單了,但是,還是沒有解決工程中文件很多的情況,rcs的獲取還是要我們輸入每個(gè)需要編譯的文件,那么,就要采用函數(shù)來替我們?nèi)懭脒@些依賴文件。

$(wildcard PATTERN. . .)
這個(gè)函數(shù)的功能是獲取指定目錄下指定類型的文件。
其中參數(shù)PATTERN是某個(gè)目錄下某種類型的文件,多個(gè)目錄多個(gè)類型可用空格分隔。
返回值是一個(gè)若干個(gè)文件的文件列表,文件名用空格隔開。

例如:

$(wildcard ./*.c) 返回當(dāng)前目錄下的所有以c為后綴的文件。

$(patsubst pattern, replacement, text)
這個(gè)函數(shù)的功能是查找text中的單詞是否符合模式pattern,如果符合,則用replacement替換。
pattern可以包括通配符 % 。如果replacement中也包含 % ,那么replacement中的 % 將和 pattern中的 % 保持一致。
返回值為替換后的字符串。

例如:

$(patsubst %.c, %.o, a.c, b.c) 返回a.o, b.o。

這樣,我們上面那個(gè)例子就可以改寫為:

#Makefile
rcs = $(wildcard ./*.c)
objs = (patsubst %.c, %.o, $(src))
app: $(objs)
	$(CC) $(objs) -o $@
%.o: %.c #上方規(guī)則會(huì)執(zhí)行兩次此規(guī)則
	$(CC) -c $< -o $@

Makefile clean規(guī)則

在我們執(zhí)行完make指令后,會(huì)發(fā)現(xiàn)當(dāng)前目錄下多出了很多以o為后綴的文件,但是我們僅需要最終的目標(biāo)文件app,其他的都是多余的,我們?cè)撊绾翁幚?。clean規(guī)則就會(huì)幫助我們處理他們。

clean

我們只用將clean規(guī)則添加到Makefile的最后,即可在每次編譯完成后執(zhí)行clean規(guī)則中的命令。如:

#Makefile
rcs = $(wildcard ./*.c)
objs = (patsubst %.c, %.o, $(src))
app: $(objs)
	$(CC) $(objs) -o $@
%.o: %.c #上方規(guī)則會(huì)執(zhí)行兩次此規(guī)則
	$(CC) -c $< -o $@
clean:
	rm $(objs) -f #rm指令刪除 -f迭代刪除

但是你會(huì)發(fā)現(xiàn)當(dāng)前目錄下多出了一個(gè)clean目標(biāo)文件,依舊會(huì)采用Makefile的策略,對(duì)比修改時(shí)間,導(dǎo)致我們時(shí)常及時(shí)執(zhí)行了clean,還是無法清除文件,那么,我們就需要接下來這個(gè)操作。

我們將clean定義為偽目標(biāo),即 .PHONY:clean 那么它就不會(huì)生成目標(biāo)文件,少了對(duì)比,那么每次都會(huì)執(zhí)行。

例如:

#Makefile
rcs = $(wildcard ./*.c)
objs = (patsubst %.c, %.o, $(src))
app: $(objs)
	$(CC) $(objs) -o $@
%.o: %.c #上方規(guī)則會(huì)執(zhí)行兩次此規(guī)則
	$(CC) -c $< -o $@
.PHONY: clean #偽目標(biāo)
clean:
	rm $(objs) -f #rm指令刪除 -f迭代刪除

到此這篇關(guān)于Linux下Makefile的編寫與使用詳解的文章就介紹到這了,更多相關(guān)Linux Makefile編寫與使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows 10 + vwware+centos 6.5虛擬機(jī)系統(tǒng)安裝Tomcat

    windows 10 + vwware+centos 6.5虛擬機(jī)系統(tǒng)安裝Tomcat

    這篇文章主要介紹了windows 10 + vwware+centos 6.5虛擬機(jī)系統(tǒng)安裝Tomcat的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Linux中的信號(hào)(注冊(cè),注銷,處理,阻塞)

    Linux中的信號(hào)(注冊(cè),注銷,處理,阻塞)

    這篇文章主要介紹了Linux中的信號(hào)(注冊(cè),注銷,處理,阻塞),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Linux平臺(tái)安裝redis及redis擴(kuò)展的方法

    Linux平臺(tái)安裝redis及redis擴(kuò)展的方法

    這篇文章主要介紹了Linux平臺(tái)安裝redis及redis擴(kuò)展的方法,較為詳細(xì)的分析了Linux平臺(tái)redis安裝步驟、操作命令與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • linux防火墻狀態(tài)查看的方法實(shí)例

    linux防火墻狀態(tài)查看的方法實(shí)例

    在本篇文章了小編給大家整理了關(guān)于linux防火墻狀態(tài)查看的方法實(shí)例的相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • CentOS系統(tǒng)下安裝及配置JDK介紹

    CentOS系統(tǒng)下安裝及配置JDK介紹

    大家好,本篇文章主要講的是CentOS系統(tǒng)下安裝及配置JDK介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • foreman ubuntu16 快速安裝

    foreman ubuntu16 快速安裝

    foreman ubuntu16快速安裝,非常實(shí)用的方法,小編覺得很不錯(cuò),分享給大家,希望對(duì)大家有幫助
    2018-09-09
  • linux服務(wù)器磁盤空間擴(kuò)充方法

    linux服務(wù)器磁盤空間擴(kuò)充方法

    大家好,本篇文章主要講的是linux服務(wù)器磁盤空間擴(kuò)充方法,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下哦,方便下次瀏覽
    2021-12-12
  • Centos安裝samba文件服務(wù)器方法

    Centos安裝samba文件服務(wù)器方法

    這篇文章主要介紹了Centos安裝samba文件服務(wù)器的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • centos7(redhat7)如何卸載自帶yum并且安裝國(guó)內(nèi)yum源的方法

    centos7(redhat7)如何卸載自帶yum并且安裝國(guó)內(nèi)yum源的方法

    本篇文章主要介紹了centos7(redhat7)如何卸載自帶yum并且安裝國(guó)內(nèi)yum源的方法,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • 詳解CentOS下Nginx如何禁止IP訪問

    詳解CentOS下Nginx如何禁止IP訪問

    服務(wù)器的安全相信是每位運(yùn)維人員最關(guān)心的問題,不知道大家在使用的時(shí)候會(huì)不會(huì)遇到很多的惡意IP攻擊,最近公司的服務(wù)器就遇到了這個(gè)問題,這個(gè)時(shí)候就要用到Nginx 禁止IP訪問了。本文介紹了詳細(xì)的步驟,有同樣問題的朋友們可以參考學(xué)習(xí)。
    2016-10-10

最新評(píng)論

荔波县| 竹北市| 如皋市| 灌云县| 古蔺县| 延吉市| 宁都县| 合肥市| 岳阳市| 武冈市| 宜昌市| 秦安县| 阜阳市| 长治县| 乌鲁木齐县| 阿城市| 昌黎县| 东莞市| 遵义县| 芜湖市| 通辽市| 林芝县| 枣强县| 云安县| 米林县| 昌江| 庐江县| 商南县| 泰和县| 渭南市| 宜兰市| 遵化市| 上虞市| 宁明县| 运城市| 平邑县| 城步| 乌拉特中旗| 灵川县| 镇安县| 娄烦县|