新聞中心
我們在上節(jié)中說到 makefile 的本質(zhì)就是一個(gè)腳本程序,用來解釋執(zhí)行的。那么它的意義是用于定義源文件間的依賴關(guān)系,說明如何編譯各個(gè)源文件并生成可執(zhí)行文件。我們來看看依賴的定義,如下
下來我們來分析下 makefile中元素的意義:a> targets:通常是需要生成的目標(biāo)文件名,make 所需執(zhí)行的命令名稱;b> perequisities:當(dāng)前目標(biāo)所依賴的其他目標(biāo)或文件;c> command:完成目標(biāo)所需要執(zhí)行的命令。我們來說說規(guī)則中的注意事項(xiàng):a> targets可以包含多個(gè)目標(biāo),使用空格對多個(gè)目標(biāo)名進(jìn)行分隔;b> perequisities可以包含多個(gè)依賴,使用空格對多個(gè)依賴進(jìn)行分隔;c> [ Tab ]鍵 '\t',每一個(gè)命令行必須以 [ Tab ] 字符開始,[ Tab ] 字符告訴 make 此行是一個(gè)命令行;d> 續(xù)行符 \,可以將內(nèi)容分開寫到下一行,提高代碼可讀性。
下來我們看看一個(gè) makefile 的依賴示例,如下
依賴規(guī)則是:a> 當(dāng)目標(biāo)對應(yīng)的文件不存在,執(zhí)行對應(yīng)命令;b> 當(dāng)依賴在時(shí)間上比目標(biāo)更新,執(zhí)行對應(yīng)命令;c> 當(dāng)依賴關(guān)系連續(xù)發(fā)生時(shí),對比依賴鏈上的每一個(gè)目標(biāo)。在這講個(gè)小技巧:makefile 中可以在命令前加上 @ 符,作用為命令無回顯。
我們還是以代碼為例來進(jìn)行分析說明
all : test @echo "make all" test : @echo "make test"我們定義的目標(biāo) all 的依賴是 test,而 test 目標(biāo)則沒有依賴,只是執(zhí)行打印語句。當(dāng) test 目標(biāo)正確執(zhí)行后,all 目標(biāo)的執(zhí)行語句便會進(jìn)行正常輸出。也就是說,先打印 make test,在輸出 make all。我們來看看編譯結(jié)果
那為什么只打印出這兩句,沒有打印出上一節(jié)我們看到的 echo "make all" 呢?原因就是我們在它們前面加的 @ 無回顯符號,下來我們?nèi)サ?@ 符號看看編譯效果
以后如果我們不想看到 echo 那條命令本身的話,可以加上 @ 無回顯符號。下來我們來看個(gè) make 的編譯案例,結(jié)構(gòu)如下
我們來根據(jù)上面的結(jié)構(gòu)編寫相應(yīng)的 makefile 程序,看看執(zhí)行效果
func.c 源碼
#includemain.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我們來看看編譯結(jié)果
我們看到已經(jīng)實(shí)現(xiàn)了。我們再來在 func.c 中打印的語句前加上 hello,再來看看編譯結(jié)果
我們看到再次進(jìn)行編譯時(shí),它只編譯了 func.c 文件,沒有編譯 main.c 文件,這也極大的提升了嵌入式編譯的效率。那么在這塊有個(gè)小技巧,在工程開發(fā)中可以將最終可執(zhí)行文件名和 all 同時(shí)作為 makefile 中第一條規(guī)則的目標(biāo),如下
我們再次來編譯,看看編譯結(jié)果
我們看到它說 hello.out 是最新的,執(zhí)行的結(jié)果和我們之前是一樣的。因此這個(gè)小技巧可以極大的提高我們因重復(fù)編譯帶來的效率低下的問題。我們也可以直接 make all 進(jìn)行再次編譯,如下
這次因?yàn)樵次募紱]有改動(dòng),所以只執(zhí)行了 hello.out 目標(biāo)后面的語句。提高對 makefile 結(jié)構(gòu)的學(xué)習(xí),總結(jié)如下:1、makefile 用于定義源文件間的依賴關(guān)系;2、makefile 說明如何編譯各個(gè)源文件并生成可執(zhí)行文件;3、makefile 中的目標(biāo)之間存在連續(xù)依賴關(guān)系;4、依賴存在并且命令執(zhí)行成功是目標(biāo)完成的充要條件。
歡迎大家一起來學(xué)習(xí) makefile 語言,可以加我QQ:243343083。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
新聞標(biāo)題:初識makefile的結(jié)構(gòu)(二)-創(chuàng)新互聯(lián)
分享URL:http://www.ef60e0e.cn/article/pgpdd.html