makefile學(xué)習(xí) | |
make是一個(gè)命令工具,是一個(gè)解釋makefile中指令的命令工具。 一般來說每一個(gè)源文件都會(huì)對(duì)應(yīng)一個(gè)中間目標(biāo)文件。 編譯(compile)生成中間目標(biāo)文件,連接(link)生成可執(zhí)行文件,連接主要是連接函數(shù)和變量。鏈接器不管源文件,只管中間目標(biāo)文件。函數(shù)如果未被聲明可以生成中間目標(biāo)文件,但是連接時(shí)候會(huì)報(bào)錯(cuò)。 make命令執(zhí)行時(shí)候需要一個(gè)makefile文件,以告訴make命令需要怎么樣去編譯和連接程序。我們需要一個(gè)makefile來告訴make命令如何編譯個(gè)連接。規(guī)則是: 1)如果這個(gè)工程沒有被編譯過,那么我們所有的c文件都要被編譯并且被連接 2)如果這個(gè)工程中間的幾個(gè)c文件被修改,那么我們只需要編譯被修改的c文件,并且連接目標(biāo)程序 3)如果這個(gè)工程的頭文件被修改,那么需要編譯引用這個(gè)頭文件的c文件。并且連接目標(biāo)文件。 makefile的規(guī)則: targe...: prerequisites... command ... ... ;target就是一個(gè)目標(biāo)文件,可以是一個(gè)obj文件,也可以是可執(zhí)行文件,還可以是一個(gè)標(biāo)簽(label)。 ;prerequisites就是要生成那個(gè)target所需要的文件或者是目標(biāo)。 ;command也就是make要執(zhí)行的命令。(任意的shell命令) 依賴關(guān)系實(shí)質(zhì)上說明了目標(biāo)文件是由哪些文件生成的,換言之,目標(biāo)文件是由哪些文件更新的。在定義好依賴關(guān)系以后,后續(xù)的那一行定義了如何生成目標(biāo)文件的操作系統(tǒng)命令,一定要一個(gè)tab鍵開頭。 在默認(rèn)的方式下,我們只是輸入了make命令,那么make是如何工作的呢? 1)make會(huì)在當(dāng)前目錄下尋找名字叫“Makefile”或者“makefile”的文件 2)如果找到,它就會(huì)找文件中的第一個(gè)目標(biāo)文件(target)。就是makefile文件中的第一個(gè)target。并且把這個(gè)文件作為最終的目標(biāo)文件。 3)如果目標(biāo)文件不存在,或者是目標(biāo)所依賴后面的.o文件的修改時(shí)間要比target文件新,那么就會(huì)執(zhí)行后面所定義的命令來生成目標(biāo)文件 4)如果目標(biāo)文件所依賴的.o文件也不存在,那么make就會(huì)在當(dāng)前文件中間尋找.o文件的依賴型。生成.0文件 5)當(dāng)然,c文件和h文件都是存在的啦。于是make會(huì)生成.o文件,然后再用.o文件生成make的終極任務(wù),也就是最終的目標(biāo)文件。 make的依賴型:make會(huì)一層一層的尋找文件的依賴關(guān)系,直到最終編譯出第一個(gè)目標(biāo)文件。在找尋的過程中如果出現(xiàn)錯(cuò)誤,比如最后被依賴的文件沒有找到,那么make會(huì)直接推出,并且報(bào)錯(cuò)。對(duì)于所定義的命令的錯(cuò)誤,或者是編譯不成功,make根本不理睬。make只管文件的依賴型。 聲明一個(gè)變量,叫objects,OBJECTS,objs,OBJS,obj,OBJ.在makefile中以“$(objects)”的方式來使用這個(gè)變量。 每一個(gè)makefile中都應(yīng)該寫一個(gè)清空目標(biāo)文件(.o和執(zhí)行文件)的規(guī)則。這不僅便于重新編譯,而且有利于保持文件的清潔。clean從來就是放在文件的最后。 makefile里面有什么?主要包括五個(gè)東西:顯式規(guī)則,隱晦規(guī)則,變量定義,文件指示和注釋。 1)顯式規(guī)則:要生成的文件,文件的依賴文件和生成的命令。 2)隱晦規(guī)則:make有自動(dòng)推導(dǎo)的功能,能夠推導(dǎo)出依賴關(guān)系。 3)變量的定義:makefile中要定義一系列的變量,變量一般都是字符串。 4)文件指示:包括三部分: A)一個(gè)makefile引用另一個(gè)makefile,類似于c中的“include”。使用include關(guān)鍵字將別的makefile包含進(jìn)來。語法:include<filename> B)根據(jù)某些情況指定makefile中的有效部分,類似于c中的“#if” C)多行命令 5)注釋:行注釋“#”,用“\#”進(jìn)行轉(zhuǎn)義。 make一次尋找“GNUmakefile”,“makefile”,“Makefile”。 偽目標(biāo)并不是一個(gè)文件,只是一個(gè)標(biāo)簽,由于“偽目標(biāo)”不是文件,所以make無法生成他的依賴關(guān)系和決定它是否要執(zhí)行。為了避免偽目標(biāo)和文件重名,使用特殊的標(biāo)記“.PHONY”來顯式的表示是“偽目標(biāo)”。 |
聯(lián)系客服