??前言
? ? ? ? 大家好,好久不見!今天小獅子為大家?guī)?lái)的文章是一篇關(guān)于Linux下的項(xiàng)目自動(dòng)化構(gòu)建工具——make和makefile的博客,希望能幫助到大家。
正文
? ? ? ? 當(dāng)我們進(jìn)行涉及多文件的工程開發(fā)時(shí),我們需要對(duì)很多不同類型、不同功能,存在于不同目錄下的源文件進(jìn)行編譯操作,這時(shí)錯(cuò)綜復(fù)雜的文件關(guān)系會(huì)對(duì)我們?cè)斐珊艽蟮穆闊?。那么這時(shí)我們就需要使用到make和makefile這樣的自動(dòng)化構(gòu)建工具。
? ? ? ? 我們先大致地對(duì)make和makefile進(jìn)行描述:
? ? ? ? makefile是一個(gè)文件,其中定義了各個(gè)源文件的編譯規(guī)則,比如說(shuō)哪個(gè)文件應(yīng)該先編譯,哪個(gè)文件應(yīng)該后編譯,哪些文件需要重新編譯等。除此之外,在makefile中還可以進(jìn)行一些功能操作,例如對(duì)工程中的老舊文件進(jìn)行清理。
?
? ? ? ? make是一條指令,它可以解析makefile中的各種指令,從而自動(dòng)化地對(duì)工程中的源文件進(jìn)行各種操作。
?
? ? ? ? make和makefile搭配使用可以大大地減少我們的工作量,達(dá)成“自動(dòng)化編譯”,這時(shí)我們只需要一個(gè)指令便可以使整個(gè)工程完全自動(dòng)編譯。
? ? ? ? 當(dāng)我們大致地了解了make和makefile之后,我們接著對(duì)這兩者進(jìn)行詳細(xì)的學(xué)習(xí)。
簡(jiǎn)單的運(yùn)用
? ? ? ? 當(dāng)我們想要使用make和makefile,我們首先需要在當(dāng)前目錄下創(chuàng)建一個(gè)makefile,makefile的文件名可以為makefile、Makefile或者GNUmakefile。這時(shí)固定的,因?yàn)樵谀J(rèn)的情況下,make命令會(huì)在當(dāng)前目錄下按順序找尋文件名為“GNUmakefile”、“makefile”、“Makefile”的文件。
? ? ? ? 那么我們以經(jīng)典的“Hello world!”來(lái)簡(jiǎn)單演示和講解make和makefile的使用方法。當(dāng)我們創(chuàng)建了一個(gè)makefile之后,我們還需要?jiǎng)?chuàng)建該程序所需要的源文件,我將它命名為main.c,并在其中編寫相關(guān)的代碼(輸出"Hello world!")。
? ? ? ? 準(zhǔn)備過(guò)程完成如下:
? ? ? ? ? 現(xiàn)在我們進(jìn)行對(duì)makefile文件的編寫,編寫makefile時(shí),我們需要寫入的內(nèi)容主要有兩個(gè),分別稱為依賴關(guān)系和依賴方法。
依賴關(guān)系:
? ? ? ? 表示一個(gè)文件的生成是依附于另一個(gè)文件,語(yǔ)法為 【目標(biāo)文件:被編譯文件】 ,也就是表明目標(biāo)文件依賴被編譯文件。
依賴方法:
? ? ? ? 代表依賴關(guān)系中的依賴文件該如何轉(zhuǎn)化為目標(biāo)文件,語(yǔ)法為 【tab 由依賴文件生成目標(biāo)文件的手段】(這里必須使用tab作為前綴)。
? ? ? ? 那么讓我們看看Hello world對(duì)應(yīng)的makefile的依賴關(guān)系和依賴方法該如何編寫:
? ? ? ? ?這樣設(shè)定好依賴關(guān)系和依賴方法之后我們就可以使用make創(chuàng)建出名為?HW?的可執(zhí)行文件。語(yǔ)法為【make 指令】。其中?:
- makefile中可能會(huì)有多個(gè)目標(biāo)文件,但是makefile會(huì)以第一個(gè)目標(biāo)作為終極目標(biāo)。
- 使用make時(shí)的默認(rèn)動(dòng)作就是第一個(gè)目標(biāo)對(duì)應(yīng)的規(guī)則,也就是只輸入make就會(huì)默認(rèn)生成第一個(gè)目標(biāo)。
- make掃描makefile的順序是從上到下。
? ? ? ? ?除此之外,如果我們現(xiàn)在想要對(duì)編譯過(guò)程中產(chǎn)生的臨時(shí)文件進(jìn)行清理或者清理舊版本的程序時(shí),如果我們直接使用rm指令進(jìn)行清除,這樣的行為未免有些粗魯和危險(xiǎn)。于是makefile中也需要支持對(duì)文件的清理工作,也就是clean。同樣按照依賴關(guān)系和依賴方法的形式進(jìn)行編寫:
? ? ? ? ?那么我們現(xiàn)在可以嘗試使用makefile中的規(guī)則對(duì)文件進(jìn)行清理:
? ? ? ? ? ? ? ? ?上面就是make和makefile的一些簡(jiǎn)單運(yùn)用,現(xiàn)在我們來(lái)看看makefile的工作原理:
- 目標(biāo)的生成:?a. 檢查依賴關(guān)系中的依賴文件是否存在; b. 若依賴文件不存在,則尋找是否有某個(gè)規(guī)則用來(lái)生成該依賴文件。
- 目標(biāo)的更新:?a. 檢查目標(biāo)的所有依賴,任何一個(gè)依賴有更新時(shí),就重新生成目標(biāo); b. 目標(biāo)文件比依賴文件時(shí)間晚,則需要更新。
? ? ? ? 在目標(biāo)的更新中提到了文件時(shí)間的問(wèn)題,這里簡(jiǎn)單的拓展一些關(guān)于文件時(shí)間的知識(shí)。我們都知道,文件=文件內(nèi)容+文件時(shí)間。文件時(shí)間一般被分成三個(gè)時(shí)間,可以簡(jiǎn)單記為ACM三個(gè)時(shí)間:A(Access)、C(Change)、M(Modify)。Change代表最近改變文件內(nèi)容的時(shí)間,Modify代表最近改變文件屬性的時(shí)間,Access代表最近讀文件的時(shí)間。
偽目標(biāo)
? ? ? ? 如果我們不想考慮文件時(shí)間,而想要無(wú)論什么情況都重新編譯,這時(shí)就需要設(shè)置偽目標(biāo)。偽目標(biāo)表示這個(gè)目標(biāo)總是被執(zhí)行。一般來(lái)說(shuō)產(chǎn)生可執(zhí)行文件的邏輯是不會(huì)用偽目標(biāo)修飾的,偽目標(biāo)一般用于clean。
特殊符號(hào)
? ? ? ? makefile中有一些特殊符號(hào),這里列舉一些特殊符號(hào)。
????????-?:表示此命令即使執(zhí)行出錯(cuò),也依然繼續(xù)執(zhí)行后續(xù)命令。如:
????????-rm a.o build/
? ? ? ? @:表示該命令只執(zhí)行,不回顯。一般規(guī)則執(zhí)行時(shí)會(huì)在終端打印出正在執(zhí)行的規(guī)則,而加上此符號(hào)后將只執(zhí)行命令,不回顯執(zhí)行的規(guī)則。如:
? ? ? ? @gcc -o HW main.c
? ? ? ? $@和$^ 前者指的是依賴關(guān)系中的目標(biāo)文件,后者指的是依賴關(guān)系中的依賴文件。如;
? ? ? ? HW:main.c
? ? ? ? gcc -o $@ $^文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-535272.html
??結(jié)語(yǔ)
? ? ? ? 以上就是make和makefile的基本入門知識(shí)啦,希望能對(duì)大家有所幫助。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-535272.html
到了這里,關(guān)于【Linux】Linux下的項(xiàng)目自動(dòng)化構(gòu)建工具——make和makefile的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!