您好,登錄后才能下訂單哦!
我們?cè)谏瞎?jié)中說(shuō)到 makefile 的本質(zhì)就是一個(gè)腳本程序,用來(lái)解釋執(zhí)行的。那么它的意義是用于定義源文件間的依賴(lài)關(guān)系,說(shuō)明如何編譯各個(gè)源文件并生成可執(zhí)行文件。我們來(lái)看看依賴(lài)的定義,如下
下來(lái)我們來(lái)分析下 makefile 中元素的意義:a> targets:通常是需要生成的目標(biāo)文件名,make 所需執(zhí)行的命令名稱(chēng);b> perequisities:當(dāng)前目標(biāo)所依賴(lài)的其他目標(biāo)或文件;c> command:完成目標(biāo)所需要執(zhí)行的命令。我們來(lái)說(shuō)說(shuō)規(guī)則中的注意事項(xiàng):a> targets 可以包含多個(gè)目標(biāo),使用空格對(duì)多個(gè)目標(biāo)名進(jìn)行分隔;b> perequisities 可以包含多個(gè)依賴(lài),使用空格對(duì)多個(gè)依賴(lài)進(jìn)行分隔;c> [ Tab ] 鍵 '\t',每一個(gè)命令行必須以 [ Tab ] 字符開(kāi)始,[ Tab ] 字符告訴 make 此行是一個(gè)命令行;d> 續(xù)行符 \,可以將內(nèi)容分開(kāi)寫(xiě)到下一行,提高代碼可讀性。
下來(lái)我們看看一個(gè) makefile 的依賴(lài)示例,如下
依賴(lài)規(guī)則是:a> 當(dāng)目標(biāo)對(duì)應(yīng)的文件不存在,執(zhí)行對(duì)應(yīng)命令;b> 當(dāng)依賴(lài)在時(shí)間上比目標(biāo)更新,執(zhí)行對(duì)應(yīng)命令;c> 當(dāng)依賴(lài)關(guān)系連續(xù)發(fā)生時(shí),對(duì)比依賴(lài)鏈上的每一個(gè)目標(biāo)。在這講個(gè)小技巧:makefile 中可以在命令前加上 @ 符,作用為命令無(wú)回顯。
我們還是以代碼為例來(lái)進(jìn)行分析說(shuō)明
all : test @echo "make all" test : @echo "make test"
我們定義的目標(biāo) all 的依賴(lài)是 test,而 test 目標(biāo)則沒(méi)有依賴(lài),只是執(zhí)行打印語(yǔ)句。當(dāng) test 目標(biāo)正確執(zhí)行后,all 目標(biāo)的執(zhí)行語(yǔ)句便會(huì)進(jìn)行正常輸出。也就是說(shuō),先打印 make test,在輸出 make all。我們來(lái)看看編譯結(jié)果
那為什么只打印出這兩句,沒(méi)有打印出上一節(jié)我們看到的 echo "make all" 呢?原因就是我們?cè)谒鼈兦懊婕拥?@ 無(wú)回顯符號(hào),下來(lái)我們?nèi)サ?@ 符號(hào)看看編譯效果
以后如果我們不想看到 echo 那條命令本身的話,可以加上 @ 無(wú)回顯符號(hào)。下來(lái)我們來(lái)看個(gè) make 的編譯案例,結(jié)構(gòu)如下
我們來(lái)根據(jù)上面的結(jié)構(gòu)編寫(xiě)相應(yīng)的 makefile 程序,看看執(zhí)行效果
func.c 源碼
#include <stdio.h> int foo() { printf("void foo()\n"); }
main.c 源碼
extern void foo(); int main() { foo(); return 0; }
makefile 源碼
hello.out : func.o main.o gcc -o hello.out func.o main.o func.o : func.c gcc -o func.o -c func.c main.o : main.c gcc -o main.o -c main.c
我們來(lái)看看編譯結(jié)果
我們看到已經(jīng)實(shí)現(xiàn)了。我們?cè)賮?lái)在 func.c 中打印的語(yǔ)句前加上 hello,再來(lái)看看編譯結(jié)果
我們看到再次進(jìn)行編譯時(shí),它只編譯了 func.c 文件,沒(méi)有編譯 main.c 文件,這也極大的提升了嵌入式編譯的效率。那么在這塊有個(gè)小技巧,在工程開(kāi)發(fā)中可以將最終可執(zhí)行文件名和 all 同時(shí)作為 makefile 中第一條規(guī)則的目標(biāo),如下
我們?cè)俅蝸?lái)編譯,看看編譯結(jié)果
我們看到它說(shuō) hello.out 是最新的,執(zhí)行的結(jié)果和我們之前是一樣的。因此這個(gè)小技巧可以極大的提高我們因重復(fù)編譯帶來(lái)的效率低下的問(wèn)題。我們也可以直接 make all 進(jìn)行再次編譯,如下
這次因?yàn)樵次募紱](méi)有改動(dòng),所以只執(zhí)行了 hello.out 目標(biāo)后面的語(yǔ)句。提高對(duì) makefile 結(jié)構(gòu)的學(xué)習(xí),總結(jié)如下:1、makefile 用于定義源文件間的依賴(lài)關(guān)系;2、makefile 說(shuō)明如何編譯各個(gè)源文件并生成可執(zhí)行文件;3、makefile 中的目標(biāo)之間存在連續(xù)依賴(lài)關(guān)系;4、依賴(lài)存在并且命令執(zhí)行成功是目標(biāo)完成的充要條件。
歡迎大家一起來(lái)學(xué)習(xí) makefile 語(yǔ)言,可以加我QQ:243343083。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。