溫馨提示×

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

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

makefile(01)_初識(shí)

發(fā)布時(shí)間:2020-08-14 07:52:06 來(lái)源:網(wǎng)絡(luò) 閱讀:913 作者:三九感冒靈 欄目:系統(tǒng)運(yùn)維

0. 聲明

本系列(makefile)文章,從零基礎(chǔ)開(kāi)始,通過(guò)實(shí)驗(yàn)逐步分析makefile的語(yǔ)法特性,并最終打造一個(gè)可復(fù)用、可移植的專(zhuān)業(yè)編譯環(huán)境。
參考:
1.DT 唐老師門(mén)徒計(jì)劃課程
2.GNU make 手冊(cè):http://www.gnu.org/software/make/manual/make.html

1.Make與makefile

  • Make是一個(gè)應(yīng)用程序:接續(xù)源程序之間的依賴(lài)關(guān)系,根據(jù)依賴(lài)關(guān)系自動(dòng)維護(hù)編譯工作,執(zhí)行宿主操作系統(tǒng)中的各種命令。
  • Makefile是一個(gè)描述文件:定義了系列的規(guī)則來(lái)指定源文件編譯后的先后順序,擁有特定的語(yǔ)法規(guī)則,支持函數(shù)定義和函數(shù)調(diào)用,能夠直接集成操作系統(tǒng)的各種命令,本質(zhì)上也是一種腳本。
    兩者的聯(lián)系:
  • Makefile中的描述用于指導(dǎo)make程序如何完成工作;
  • make根據(jù)Makefile中的規(guī)則執(zhí)行命令,最后完成編譯輸出;
    簡(jiǎn)單示例:
hello:                          // 目標(biāo)
    echo “hello makefile”       // 實(shí)現(xiàn)目標(biāo)要執(zhí)行的命令,注意行首是一個(gè)table(\t)

make -f mf.txt hello // -f表示指定mf.txt文件為規(guī)則定義文件(Makefile),并執(zhí)行文件里的hello目標(biāo)

make // 執(zhí)行默認(rèn)規(guī)則定義文件(Makefile/makefile)中的默認(rèn)目標(biāo)(第一個(gè)目標(biāo))

2.Makefile結(jié)構(gòu)

2.1.Makefile的意義:

Makefile 用于定義源文件和依賴(lài)關(guān)系,說(shuō)明如何編譯各個(gè)源文件并生成可執(zhí)行文件
依賴(lài)的定義:

targets:prerequests; command1
    Command2

2.2.Makefile中的元素含義:

targets // 通常是需要生成的目標(biāo)文件名,make所需要執(zhí)行的命令名稱(chēng)
prerequisite // 當(dāng)前目標(biāo)所依賴(lài)的其他目標(biāo)或文件
command // 完成目標(biāo)所需要的命令

2.3.注意事項(xiàng):

  • 目標(biāo)和依賴(lài)可以有多個(gè),使用空格分隔
  • 每一個(gè)命令行必須以【tab】字符開(kāi)始,用于高速make程序(解析器),此行時(shí)一個(gè)命令行
  • 續(xù)行符: \ 可以將內(nèi)容分開(kāi)寫(xiě)到下一行,提高可讀性
  • Makefile中可以在命令前加上@符,作用為命令無(wú)回顯(Makefile默認(rèn)會(huì)打印執(zhí)行的每一個(gè)條命令)
    技巧:
    開(kāi)發(fā)中可以將可執(zhí)行文件名和all 同時(shí)作為makefile中第一條規(guī)則的目標(biāo),這樣,當(dāng)執(zhí)行make命令并且目標(biāo)已經(jīng)存在時(shí),將不會(huì)繼續(xù)執(zhí)行(除非依賴(lài)文件有更新)

    2.4.依賴(lài)規(guī)則:

    當(dāng)目標(biāo)對(duì)應(yīng)的文件不存在,執(zhí)行對(duì)應(yīng)命令
    當(dāng)依賴(lài)在時(shí)間上比目標(biāo)更新,執(zhí)行對(duì)應(yīng)命令
    當(dāng)依賴(lài)關(guān)系發(fā)生時(shí),對(duì)比依賴(lài)鏈上每一個(gè)目標(biāo)

hello.out all : 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

makefile(01)_初識(shí)

3.偽目標(biāo)的引入

3.1.Makefile中的目標(biāo)究竟是什么?

默認(rèn)情況下,make認(rèn)為目標(biāo)對(duì)應(yīng)著一個(gè)文件,make會(huì)比較文件和依賴(lài)關(guān)系的新舊關(guān)系,決定執(zhí)行是否執(zhí)行命令,make以文件處理作為第一優(yōu)先級(jí)。
所以當(dāng)出現(xiàn)和目標(biāo)同名的文件時(shí),則在文件不被更新的前提下,目標(biāo)不會(huì)被執(zhí)行
makefile(01)_初識(shí)

3.2.Makefile中的偽目標(biāo)

通過(guò)PHONY關(guān)鍵字聲明一個(gè)偽目標(biāo),偽目標(biāo)不對(duì)應(yīng)任何實(shí)際的文件,不管偽目標(biāo)的依賴(lài)時(shí)否更新,命令總是執(zhí)行。
偽目標(biāo)的語(yǔ)法:先聲明,后使用
本質(zhì):偽目標(biāo)是make中特殊的目標(biāo):.PHONY的依賴(lài)

.PHONY : clean

clean :
    rm *.o hello.out -rf 

3.3.偽目標(biāo)的妙用:

規(guī)則調(diào)用,模擬C語(yǔ)言函數(shù)的概念。
原理:當(dāng)一個(gè)目標(biāo)的依賴(lài)包含偽目標(biāo)時(shí),偽目標(biāo)所定義的命令總是會(huì)被執(zhí)行。

.PHONY : rebuild clean all

rebuild : clean all

all : hello.out

clean :
    rm *.o hello.out  -rf 

3.4.繞開(kāi).PHONY關(guān)鍵字定義偽目標(biāo)

原理:如果一個(gè)規(guī)則沒(méi)有命令或者依賴(lài),并且他的目標(biāo)不是一個(gè)存在的文件名,在執(zhí)行此規(guī)則是,目標(biāo)總會(huì)被認(rèn)為是最新的。

clean : FORCE
    rm *.o hello.out -rf 
FORCE : 
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guā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