欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux下Makefile的編寫與使用詳解

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

Makefile

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

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

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

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

文件命名

采用makefile或Makefile都可。

Makefile規(guī)則

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

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

注意,命令前必須有一個tab縮進。

例如:

#Makefile
app: a.c b.c #目標:依賴
	gcc a.c b.c -o app #注意這行最開始的縮進

make以上這個Makefile后就會將目錄下的a.cb.c編譯為目標文件app。

Makefile的工作原理

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

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

如果不存在:向下檢查其他規(guī)則,是否存在其他規(guī)則生成當前規(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

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

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

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

Makefile變量

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

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

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

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

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

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

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

Makefile函數

我們可以看到,上面這個Makefile已經相對簡單了,但是,還是沒有解決工程中文件很多的情況,rcs的獲取還是要我們輸入每個需要編譯的文件,那么,就要采用函數來替我們去寫入這些依賴文件。

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

例如:

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

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

例如:

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

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

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

Makefile clean規(guī)則

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

clean

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

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

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

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

例如:

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

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

相關文章

  • linux nslookup命令使用詳解

    linux nslookup命令使用詳解

    這篇文章主要介紹了linux nslookup命令使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • linux下php安裝xml擴展的詳細步驟

    linux下php安裝xml擴展的詳細步驟

    在本篇文章里小編給大家整理了關于linux下php安裝xml擴展的詳細步驟,有需要的朋友們可以學習參考下。
    2020-02-02
  • Linux 中PHP的安裝教程

    Linux 中PHP的安裝教程

    這篇文章主要介紹了Linux 中PHP的安裝教程,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • vsftp上傳553 Could not create file錯誤解決

    vsftp上傳553 Could not create file錯誤解決

    本篇文章給大家分享了在vsftp上傳文件的時候出現(xiàn)了553 Could not create file錯誤,針對這個錯誤我們給出了解決辦法,一起學習下。
    2017-12-12
  • 80端口被占用 Apache啟動失敗的解決方法

    80端口被占用 Apache啟動失敗的解決方法

    80端口被占用,Apache啟動失敗,遇到這個問題真的很頭疼,這篇文章主要就為大家介紹了80端口被占用,Apache啟動失敗的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • centos中nginx按日期自動分割訪問日志的方法

    centos中nginx按日期自動分割訪問日志的方法

    本篇文章主要介紹了centos中nginx按日期自動分割訪問日志的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • linux之centos7防火墻基本使用詳解

    linux之centos7防火墻基本使用詳解

    這篇文章主要介紹了linux之centos7防火墻基本使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • Linux中查找文件夾的命令解讀

    Linux中查找文件夾的命令解讀

    這篇文章主要介紹了Linux中查找文件夾的命令,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • apche 多端口配置及網站指向非apche默認的網站文件夾設置方法

    apche 多端口配置及網站指向非apche默認的網站文件夾設置方法

    apche 多端口配置及網站指向非apche默認的網站文件夾設置,使用apache做服務器的朋友可以參考下。
    2010-04-04
  • Linux CentOS7 vim寄存器解讀

    Linux CentOS7 vim寄存器解讀

    這篇文章主要介紹了Linux CentOS7 vim寄存器使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論