溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

初識(shí) makefile 的結(jié)構(gòu)(二)

發(fā)布時(shí)間:2020-03-01 00:11:03 來(lái)源:網(wǎng)絡(luò) 閱讀:1903 作者:上帝之子521 欄目:系統(tǒng)運(yùn)維

        我們?cè)谏瞎?jié)中說(shuō)到 makefile 的本質(zhì)就是一個(gè)腳本程序,用來(lái)解釋執(zhí)行的。那么它的意義是用于定義源文件間的依賴(lài)關(guān)系,說(shuō)明如何編譯各個(gè)源文件并生成可執(zhí)行文件。我們來(lái)看看依賴(lài)的定義,如下

初識(shí) makefile 的結(jié)構(gòu)(二)

        下來(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)示例,如下

初識(shí) makefile 的結(jié)構(gòu)(二)

        依賴(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é)果

初識(shí) makefile 的結(jié)構(gòu)(二)

        那為什么只打印出這兩句,沒(méi)有打印出上一節(jié)我們看到的 echo "make all" 呢?原因就是我們?cè)谒鼈兦懊婕拥?@  無(wú)回顯符號(hào),下來(lái)我們?nèi)サ?@ 符號(hào)看看編譯效果

初識(shí) makefile 的結(jié)構(gòu)(二)

        以后如果我們不想看到 echo 那條命令本身的話,可以加上 @ 無(wú)回顯符號(hào)。下來(lái)我們來(lái)看個(gè) make 的編譯案例,結(jié)構(gòu)如下

初識(shí) makefile 的結(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é)果

初識(shí) makefile 的結(jié)構(gòu)(二)

        我們看到已經(jīng)實(shí)現(xiàn)了。我們?cè)賮?lái)在 func.c 中打印的語(yǔ)句前加上 hello,再來(lái)看看編譯結(jié)果

初識(shí) makefile 的結(jié)構(gòu)(二)

        我們看到再次進(jìn)行編譯時(shí),它只編譯了 func.c 文件,沒(méi)有編譯 main.c 文件,這也極大的提升了嵌入式編譯的效率。那么在這塊有個(gè)小技巧,在工程開(kāi)發(fā)中可以將最終可執(zhí)行文件名和 all 同時(shí)作為 makefile 中第一條規(guī)則的目標(biāo),如下

初識(shí) makefile 的結(jié)構(gòu)(二)

        我們?cè)俅蝸?lái)編譯,看看編譯結(jié)果

初識(shí) makefile 的結(jié)構(gòu)(二)

        我們看到它說(shuō) hello.out 是最新的,執(zhí)行的結(jié)果和我們之前是一樣的。因此這個(gè)小技巧可以極大的提高我們因重復(fù)編譯帶來(lái)的效率低下的問(wèn)題。我們也可以直接 make all 進(jìn)行再次編譯,如下

初識(shí) makefile 的結(jié)構(gòu)(二)

        這次因?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。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI