小編給大家分享一下Linux中Makefile有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了依蘭免費(fèi)建站歡迎大家使用!用這個(gè)方便的工具來更有效的運(yùn)行和編譯你的程序
makefile是用于自動(dòng)編譯和鏈接的,一個(gè)工程有很多文件組成,每一個(gè)文件的改變都會(huì)導(dǎo)致工程的重新鏈接-----但是不是所有的文件都需要重新編譯,makefile能夠紀(jì)錄文件的信息,決定在鏈接的時(shí)候需要重新編譯哪些文件!
當(dāng)你需要在一些源文件改變后運(yùn)行或更新一個(gè)任務(wù)時(shí),通常會(huì)用到 make 工具。make 工具需要讀取一個(gè) Makefile(或 makefile)文件,在該文件中定義了一系列需要執(zhí)行的任務(wù)。你可以使用 make 來將源代碼編譯為可執(zhí)行程序。大部分開源項(xiàng)目會(huì)使用 make 來實(shí)現(xiàn)最終的二進(jìn)制文件的編譯,然后使用 make install 命令來執(zhí)行安裝。
本文將通過一些基礎(chǔ)和進(jìn)階的示例來展示 make 和 Makefile 的使用方法。在開始前,請(qǐng)確保你的系統(tǒng)中安裝了 make。
基礎(chǔ)示例
依然從打印 “Hello World” 開始。首先創(chuàng)建一個(gè)名字為 myproject 的目錄,目錄下新建 Makefile 文件,文件內(nèi)容為:
say_hello: echo "Hello World"
在 myproject 目錄下執(zhí)行 make,會(huì)有如下輸出:
$ make echo "Hello World" Hello World
在上面的例子中,“say_hello” 類似于其他編程語(yǔ)言中的函數(shù)名。這被稱之為 目標(biāo)(target)。在該目標(biāo)之后的是預(yù)置條件或依賴。為了簡(jiǎn)單起見,我們?cè)谶@個(gè)示例中沒有定義預(yù)置條件。echo ‘Hello World' 命令被稱為 步驟(recipe)。這些步驟基于預(yù)置條件來實(shí)現(xiàn)目標(biāo)。目標(biāo)、預(yù)置條件和步驟共同構(gòu)成一個(gè)規(guī)則。
總結(jié)一下,一個(gè)典型的規(guī)則的語(yǔ)法為:
目標(biāo): 預(yù)置條件
<TAB> 步驟
作為示例,目標(biāo)可以是一個(gè)基于預(yù)置條件(源代碼)的二進(jìn)制文件。另一方面,預(yù)置條件也可以是依賴其他預(yù)置條件的目標(biāo)。
final_target: sub_target final_target.c Recipe_to_create_final_target sub_target: sub_target.c Recipe_to_create_sub_target
目標(biāo)并不要求是一個(gè)文件,也可以只是步驟的名字,就如我們的例子中一樣。我們稱之為“偽目標(biāo)”
再回到上面的示例中,當(dāng) make 被執(zhí)行時(shí),整條指令 echo "Hello World" 都被顯示出來,之后才是真正的執(zhí)行結(jié)果。如果不希望指令本身被打印處理,需要在 echo 前添加 @
say_hello: @echo "Hello World"
重新運(yùn)行 make,將會(huì)只有如下輸出:
$ make Hello World
接下來在 Makefile 中添加如下偽目標(biāo):generate 和 clean:
say_hello: @echo "Hello World" generate: @echo "Creating empty text files..." touch file-{1..10}.txt clean: @echo "Cleaning up..." rm *.txt
隨后當(dāng)我們運(yùn)行 make 時(shí),只有 say_hello 這個(gè)目標(biāo)被執(zhí)行。這是因?yàn)镸akefile 中的第一個(gè)目標(biāo)為默認(rèn)目標(biāo)。通常情況下會(huì)調(diào)用默認(rèn)目標(biāo),這就是你在大多數(shù)項(xiàng)目中看到 all 作為第一個(gè)目標(biāo)而出現(xiàn)。all 負(fù)責(zé)來調(diào)用它他的目標(biāo)。我們可以通過 .DEFAULT_GOAL 這個(gè)特殊的偽目標(biāo)來覆蓋掉默認(rèn)的行為。
在 Makefile 文件開頭增加 .DEFAULT_GOAL:
.DEFAULT_GOAL := generate
make 會(huì)將 generate 作為默認(rèn)目標(biāo):
$ make Creating empty text files... touch file-{1..10}.txt
顧名思義,.DEFAULT_GOAL 偽目標(biāo)僅能定義一個(gè)目標(biāo)。這就是為什么很多 Makefile 會(huì)包括 all 這個(gè)目標(biāo),這樣可以調(diào)用多個(gè)目標(biāo)。
下面刪除掉 .DEFAULT_GOAL,增加 all 目標(biāo):
all: say_hello generate say_hello: @echo "Hello World" generate: @echo "Creating empty text files..." touch file-{1..10}.txt clean: @echo "Cleaning up..." rm *.txt
運(yùn)行之前,我們?cè)僭黾右恍┨厥獾膫文繕?biāo)。.PHONY 用來定義這些不是文件的目標(biāo)。make 會(huì)默認(rèn)調(diào)用這些偽目標(biāo)下的步驟,而不去檢查文件名是否存在或最后修改日期。完整的 Makefile 如下:
.PHONY: all say_hello generate clean all: say_hello generate say_hello: @echo "Hello World" generate: @echo "Creating empty text files..." touch file-{1..10}.txt clean: @echo "Cleaning up..." rm *.txt
make 命令會(huì)調(diào)用 say_hello 和 generate:
$ make Hello World Creating empty text files... touch file-{1..10}.txt
clean 不應(yīng)該被放入 all 中,或者被放入第一個(gè)目標(biāo)中。clean 應(yīng)當(dāng)在需要清理時(shí)手動(dòng)調(diào)用,調(diào)用方法為 make clean
$ make clean Cleaning up... rm *.txt
現(xiàn)在你應(yīng)該已經(jīng)對(duì) Makefile 有了基礎(chǔ)的了解,接下來我們看一些進(jìn)階的示例。
進(jìn)階示例
變量
在之前的實(shí)例中,大部分目標(biāo)和預(yù)置條件是已經(jīng)固定了的,但在實(shí)際項(xiàng)目中,它們通常用變量和模式來代替。
定義變量最簡(jiǎn)單的方式是使用 = 操作符。例如,將命令 gcc 賦值給變量 CC:
CC = gcc
這被稱為遞歸擴(kuò)展變量,用于如下所示的規(guī)則中:
hello: hello.c ${CC} hello.c -o hello
你可能已經(jīng)想到了,這些步驟將會(huì)在傳遞給終端時(shí)展開為:
gcc hello.c -o hello
${CC} 和 $(CC) 都能對(duì) gcc 進(jìn)行引用。但如果一個(gè)變量嘗試將它本身賦值給自己,將會(huì)造成死循環(huán)。讓我們驗(yàn)證一下:
CC = gcc CC = ${CC} all: @echo ${CC}
此時(shí)運(yùn)行 make 會(huì)導(dǎo)致:
$ make Makefile:8: *** Recursive variable 'CC' references itself (eventually). Stop.
為了避免這種情況發(fā)生,可以使用 := 操作符(這被稱為簡(jiǎn)單擴(kuò)展變量)。以下代碼不會(huì)造成上述問題:
CC := gcc CC := ${CC} all: @echo ${CC}
模式和函數(shù)
下面的 Makefile 使用了變量、模式和函數(shù)來實(shí)現(xiàn)所有 C 代碼的編譯。我們來逐行分析下:
# Usage: # make # compile all binary # make clean # remove ALL binaries and objects .PHONY = all clean CC = gcc # compiler to use LINKERFLAG = -lm SRCS := $(wildcard *.c) BINS := $(SRCS:%.c=%) all: ${BINS} %: %.o @echo "Checking.." ${CC} ${LINKERFLAG} $< -o $@ %.o: %.c @echo "Creating object.." ${CC} -c $< clean: @echo "Cleaning up..." rm -rvf *.o ${BINS}
以 # 開頭的行是評(píng)論
.PHONY = all clean 行定義了 all 和 clean 兩個(gè)偽目標(biāo)。
變量 LINKERFLAG 定義了在步驟中 gcc 命令需要用到的參數(shù)。
SRCS := $(wildcard *.c):$(wildcard pattern) 是與文件名相關(guān)的一個(gè)函數(shù)。在本示例中,所有 “.c”后綴的文件會(huì)被存入 SRCS 變量。
BINS := $(SRCS:%.c=%):這被稱為替代引用。本例中,如果 SRCS 的值為 'foo.c bar.c',則 BINS的值為 'foo bar'。
all: ${BINS} 行:偽目標(biāo) all 調(diào)用 ${BINS} 變量中的所有值作為子目標(biāo)。
規(guī)則:
%: %.o @echo "Checking.." ${CC} ${LINKERFLAG} $< -o $@
下面通過一個(gè)示例來理解這條規(guī)則。假定 foo 是變量 ${BINS} 中的一個(gè)值。% 會(huì)匹配到 foo(%匹配任意一個(gè)目標(biāo))。下面是規(guī)則展開后的內(nèi)容:
foo: foo.o @echo "Checking.." gcc -lm foo.o -o foo
如上所示,% 被 foo 替換掉了。$< 被 foo.o 替換掉。$<用于匹配預(yù)置條件,$@ 匹配目標(biāo)。對(duì) ${BINS} 中的每個(gè)值,這條規(guī)則都會(huì)被調(diào)用一遍。
規(guī)則:
%.o: %.c @echo "Creating object.." ${CC} -c $<
之前規(guī)則中的每個(gè)預(yù)置條件在這條規(guī)則中都會(huì)都被作為一個(gè)目標(biāo)。下面是展開后的內(nèi)容:
foo.o: foo.c @echo "Creating object.." gcc -c foo.c
最后,在 clean 目標(biāo)中,所有的二進(jìn)制文件和編譯文件將被刪除。
下面是重寫后的 Makefile,該文件應(yīng)該被放置在一個(gè)有 foo.c 文件的目錄下:
# Usage: # make # compile all binary # make clean # remove ALL binaries and objects .PHONY = all clean CC = gcc # compiler to use LINKERFLAG = -lm SRCS := foo.c BINS := foo all: foo foo: foo.o @echo "Checking.." gcc -lm foo.o -o foo foo.o: foo.c @echo "Creating object.." gcc -c foo.c clean: @echo "Cleaning up..." rm -rvf foo.o foo
這些和到一起,就是makefile,當(dāng)然這些功能還太少,可以加上很多別的項(xiàng)目。但宗旨就是:讓編譯器知道要編譯一個(gè)文件需要依賴其他的哪些文件。當(dāng)那些依賴文件有了改變,編譯器會(huì)自動(dòng)的發(fā)現(xiàn)最終的生成文件已經(jīng)過時(shí),而重新編譯相應(yīng)的模塊。
以上是“Linux中Makefile有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)頁(yè)題目:Linux中Makefile有什么用-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://jinyejixie.com/article24/diocce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、用戶體驗(yàn)、做網(wǎng)站、服務(wù)器托管、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容