




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第5章 Make及makefile文件的編寫 1.概述2. Makefile3.Makefile的規(guī)那么4. 規(guī)那么的命令5.Makefile中的變量6.執(zhí)行makeLinux系統(tǒng)下的文件編譯程序的編譯和鏈接源程序(.c)編譯(compile)鏈接(linker)構(gòu)成目的文件構(gòu)成可執(zhí)行程序1預(yù)編譯2匯編階段什么是make?Make是大型程序維護(hù)工具M(jìn)ake任務(wù)時(shí),需求名字為“makefile的makefile文件。根據(jù)依賴關(guān)系自動(dòng)決議工程的那些部分需求重新編譯。根本原理:假設(shè)某個(gè)源程序文件被修正,那么依賴這個(gè)源程序文件的一切目的文件,都需求重新編譯。Makefile RuleRule的格式為:
2、target : prerequisites commandTarget 依賴prerequisites的目的Prerequisites 被依賴的源程序,例如c文件或h文件Command需求執(zhí)行的命令當(dāng)prerequisites任何一個(gè)文件的時(shí)戳新于target的時(shí)戳?xí)r,就執(zhí)行command。makefile規(guī)那么引見一個(gè)簡單的Makefile描畫規(guī)那么組成:TARGET. : PREREQUISITES. COMMAND . -target:規(guī)那么的目的。-通常是程序中間文件(.o)或者最后可執(zhí)行文件名-目的也可以是一個(gè)make執(zhí)行的動(dòng)作的稱號,如目的“clean,這樣的目的是“偽目的-pr
3、erequisites:規(guī)那么的依賴。-生成規(guī)那么目的所需求的文件名列表。通常一個(gè)目的依賴于一個(gè)或者多個(gè)文件。 -command:規(guī)那么的命令行-是 make程序一切執(zhí)行的動(dòng)作恣意的 shell 命令或者可在 shell下執(zhí)行的程序-一個(gè)規(guī)那么可以有多個(gè)命令行,每一條命令占一行。留意:每一個(gè)命令行必需以Tab字符開場makefile文件在makefile(Makefile)文件中,采用自頂向下到的方法來闡明依賴關(guān)系network:network.o subrs.o 1 gcc network.o subrs.o o network 2network.o:network.c netdefs.h
4、3 gcc c network.c -o network.o 4subrs.o: subrs.c netdefs.h 5 gcc c subrs.c .PHONY cleanclean: rm -r *.o 6執(zhí)行make在makefile(Makefile)文件所在的目錄中,執(zhí)行make命令語法:make 選項(xiàng) 宏定義 目的文件Make的任務(wù)過程1.make在當(dāng)前目錄下找名字叫“Makefile或“makefile的文件2.假設(shè)找到,它會找文件中的第一個(gè)目的文件target,比如找到“network這個(gè)文件,并把這個(gè)文件作為最終的目的文件。3.假設(shè)network文件不存在,或是network
5、所依賴的后面的 .o 文件的文件修正時(shí)間要比network這個(gè)文件新,那么,他就會執(zhí)行后面所定義的命令來生成network這個(gè)文件。4.假設(shè)network所依賴的.o文件也存在,那么make會在當(dāng)前文件中找目的為.o文件的依賴性,假設(shè)找到那么再根據(jù)那一個(gè)規(guī)那么生成.o文件運(yùn)用源文件和.h文件。這有點(diǎn)像一個(gè)堆棧的過程make時(shí),哪些文件被重新編譯1. 一切的源文件沒有被編譯過,那么對各個(gè) C源文件進(jìn)展編譯并進(jìn)展鏈接,生成最后的可執(zhí)行程序; 2. 每一個(gè)在上次執(zhí)行make之后修正正的C源代碼文件在本 make時(shí)將會被重新編譯; 3. 頭文件在上一次執(zhí)行 make 之后被修正。那么一切包含此頭文件的
6、 C 源文件在本次執(zhí)行make 時(shí)將會被重新編譯。關(guān)于Makefile文件名默許的情況下,make命令會在當(dāng)前目錄下按順序找尋文件名為“GNUmakefile、“makefile、“Makefile的文件,找到了解釋這個(gè)文件。也可以運(yùn)用別的文件名來書寫Makefile,這是執(zhí)行Make命令時(shí),需運(yùn)用“-f和“-file參數(shù)。如:make -f Make.Linux或make -file Make.AIX 對“規(guī)那么的再認(rèn)識在 Makefile 中“規(guī)那么就是描畫在什么情況下、如何重建規(guī)那么的目的文件,通常規(guī)那么中包括了目的的依賴關(guān)系目的的依賴文件和重建目的的命令。make執(zhí)行重建目的的命令,來
7、創(chuàng)建或者重建規(guī)那么的目的此目的文件也可以是觸發(fā)這個(gè)規(guī)那么的上一個(gè)規(guī)那么中的依賴文件。規(guī)那么包含了目的和依賴的關(guān)系以及更新目的所要求的命令。 一個(gè)簡單的例子1.注釋以#開頭2.一個(gè)較長行可以運(yùn)用反斜線分解為多行,后不能有空格3.目的“clean不是一個(gè)文件,它僅僅代表了執(zhí)行一個(gè)動(dòng)作的標(biāo)識。 Makefile中把那些沒有任何依賴只需執(zhí)行動(dòng)作的目的稱為“偽目的 在執(zhí)行make時(shí),它所指定的動(dòng)作不會被執(zhí)行。除非執(zhí)行make時(shí)明確地指定它作為重建目的。而且目的“clean沒有任何依賴文件,它只需一個(gè)目的,就是經(jīng)過這個(gè)目的名來執(zhí)行它所定義的命令。Makefile中把執(zhí)行“clean目的所定義的命令,可在s
8、hell下輸入:make clean。 運(yùn)用變量在上例的 Makefile中可是添加這樣一行:objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o “objects作為一個(gè)變量,它代表一切的.o文件的列表,在需求運(yùn)用這些.o文件列表的地方運(yùn)用“$(objects)來表示它objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o edit : $(objects) gcc $(objects) -o e
9、dit. . clean : rm edit $(objects) 運(yùn)用變量的例子exe : main.o io.o gcc main.o io.o -o exemain.o : main.c gcc -g -c main.c o main.oio.o : io.c gcc -g -c io.c -o io.o OBJS = main.o io.oexe: $(OBJS) gcc $(OBJS) -o exemain.o : main.cCFLAGS=-g gcc $(CFLAGS) c main.c -o main.oio.o : io.cgcc $(CFLAGS) -c io.c -o i
10、o.o自動(dòng)推導(dǎo)規(guī)那么(隱含規(guī)那么)make中,編譯.o文件時(shí),make會以為其源程序就是同文件名的.c源文件,因此依賴列表中可以省略.c文件,這是make的隱含規(guī)那么書寫 Makefile時(shí),對于一個(gè).c 文件假設(shè)運(yùn)用 make的隱含規(guī)那么,那么它會被自動(dòng)作為對應(yīng).o 文件的一個(gè)依賴文件對應(yīng)是指:文件名除后綴外,其他都一樣的兩個(gè)文件。因此可以在規(guī)那么中省略目的的倚賴.c 文件。清洗任務(wù)目錄過程文件clean : rm edit $(objects) 普通寫為:.PHONY : clean clean : -rm edit $(objects) 兩個(gè)實(shí)現(xiàn)有兩點(diǎn)不同: 1. 經(jīng)過“.PHONY特殊
11、目的將“clean目的聲明為偽目的。防止當(dāng)磁盤上存在一個(gè)名為“clean文件時(shí),“clean所在規(guī)那么的命令無法執(zhí)行。2. 在命令行之前運(yùn)用“-,意思是忽略命令“rm的執(zhí)行錯(cuò)誤第7章 Make及makefile文件的編寫 1.概述2. Makefile3.Makefile的規(guī)那么4. 規(guī)那么的命令5.Makefile中的變量6.執(zhí)行makeMakefile的內(nèi)容在一個(gè)完好的 Makefile 中,包含了 5 個(gè)東東:顯式規(guī)那么隱含規(guī)那么變量的定義指示符注釋它描畫了在何種情況下如何更新一個(gè)或者多個(gè)被稱為目的的文件。在書寫 Makefile是需求明確地給出目的文件、目的的依賴文件列表以及更新目的文
12、件所需求的命令。它是make根據(jù)此類目的文件的命名典型的是文件名的后綴而自動(dòng)推導(dǎo)出來的規(guī)那么。make根據(jù)目的文件的名字,自動(dòng)產(chǎn)生目的的依賴文件并運(yùn)用默許的命令來對目的進(jìn)展更新。就是運(yùn)用一個(gè)字符串代表一段文本串,當(dāng)定義了變量以 后,Makefile后續(xù)在需求運(yùn)用此文本串的地方,經(jīng)過援用這個(gè)變量來實(shí)現(xiàn)對文本串的運(yùn)用指明在 make程序讀取 makefile文件過程中所要執(zhí)行的一個(gè)動(dòng)作。包括: 1. 讀取給定文件名的文件。2.決議通常是根據(jù)一個(gè)變量的得值處置或忽略Makefile中的某一特定部分3.定義一個(gè)多行變量。Makefile 中“#字符后的內(nèi)容被作為是注釋內(nèi)容注釋行的結(jié)尾假設(shè)存在反斜線,那
13、么下一行也被作為注釋行當(dāng)在 Makefile中需求運(yùn)用字符“#時(shí),可以運(yùn)用反斜線加“#來實(shí)現(xiàn)makefile文件的命名執(zhí)行make命令時(shí),默許的情況下,make 會在任務(wù)目錄執(zhí)行 make 的目錄下按照文件名順序?qū)ひ?makefile文件讀取并執(zhí)行,查找的文件名順序?yàn)椋骸癎NUmakefile、“makefile、“Makefile。通常應(yīng)該運(yùn)用“makefile或者“Makefile作為一個(gè) makefile 的文件名,“GNUmakefile 不引薦運(yùn)用,由于以此命名的文件只需“GNU make才可以識別。當(dāng) makefile文件的命名不是這三個(gè)任何一個(gè)時(shí),需求經(jīng)過 make的“-f或者“
14、-file選項(xiàng)來指定 make 讀取的 makefile 文件。包含其它的Makefileinclude FILENAMES. make暫停讀取當(dāng)前的Makefile,轉(zhuǎn)而去讀取include下的Makefile,終了后,繼續(xù)當(dāng)前的Makefile書寫在獨(dú)立的一行,不可以tab開頭可運(yùn)用“-include來替代“include,忽略由于包含文件不存在或者無法創(chuàng)建時(shí)的錯(cuò)誤提示(“-的意思是通知 make,忽略此操作的錯(cuò)誤。make繼續(xù)執(zhí)行)MAKEFILES變量假設(shè)當(dāng)前環(huán)境定義了一個(gè)“MAKEFILES的環(huán)境變量,make執(zhí)行時(shí)首先將此變量的值作為需求讀入的Makefile文件,多個(gè)文件之間運(yùn)用
15、空格分開。類似運(yùn)用指示符“include包含其它Makefile文件一樣變量“MAKEFILES主要用在“make的遞歸調(diào)用過程中的的通訊,實(shí)踐運(yùn)用中很少設(shè)置此變量。MAKEFILE_LIST變量make程序在讀取多個(gè) makefile文件時(shí),在對這些文件進(jìn)展解析執(zhí)行之前,將會被自動(dòng)的追加到變量“MAKEFILE_LIST的定義域中。make如何解析Makefile分為兩個(gè)階段第1階段:讀取一切的Makefile文件,內(nèi)建一切的變量、明確規(guī)那么和隱含規(guī)那么,并建立一切目的和依賴之間的依賴關(guān)系構(gòu)造鏈表。 第2階段:根據(jù)第1階段建立的目的和依賴之間的依賴關(guān)系構(gòu)造鏈表決議哪些目的需求更新,并運(yùn)用呼應(yīng)
16、的規(guī)那么,對該目的進(jìn)展更新。了解 make執(zhí)行過程的兩個(gè)階段是很重要的。它能協(xié)助我們更深化的了解執(zhí)行過程中變量以及函數(shù)是如何被展開的。在make的第1階段,變量和函數(shù)被展開的,稱為立刻展開,否那么為延后展開。第7章 Make及makefile文件的編寫 1.概述2. Makefile3.Makefile的規(guī)那么4. 規(guī)那么的命令5.Makefile中的變量6.執(zhí)行makeMakefile規(guī)那么Makefile中,規(guī)那么描畫了何種情況下運(yùn)用什么命令來重建一個(gè)特定的文件,此文件被稱為規(guī)那么“目的通常規(guī)那么中的目的只需一個(gè)。規(guī)那么所羅列的其他文件稱為“目的的依賴規(guī)那么中的命令是用來更新或者創(chuàng)建此規(guī)那
17、么的目的終極目的所在的規(guī)那么,應(yīng)該是Makefile中的第1個(gè)規(guī)那么,其他規(guī)那么不分次序。終極目的終極目的,就是執(zhí)行make時(shí),沒有指明詳細(xì)目的時(shí),make默許的那個(gè)目的。第1個(gè)規(guī)那么有多個(gè)目的時(shí),第1個(gè)目的為終極目的,除非以下兩種情況1.目的名以點(diǎn)號.隔開,其后沒有斜線/2.作為方式規(guī)那么的目的“終極目的“是執(zhí)行 make的獨(dú)一目的,其所在的規(guī)那么作為第一個(gè)規(guī)那么。規(guī)那么的語法通常規(guī)那么的語法格式如下: TARGETS : PREREQUISITES COMMAND . 或者是這樣: TARGETS : PREREQUISITES ; COMMAND COMMAND . 規(guī)那么的中心思想規(guī)那
18、么的中心思想就是:目的文件的內(nèi)容是由依賴文件決議,依賴文件的任何一處改動(dòng),將導(dǎo)致目前曾經(jīng)存在的目的文件的內(nèi)容過期。規(guī)那么的命令為重建目的提供了方法。這些命令運(yùn)轉(zhuǎn)在系統(tǒng) shell 之上。規(guī)那么中的命令被執(zhí)行有兩種情況1. 目的文件不存在; 2. 存在一個(gè)依賴的最后修正時(shí)間比目的的最后修正時(shí)間晚依賴的類型常規(guī)依賴常規(guī)依賴中的任何一個(gè)文件更新,都會導(dǎo)致重建目的。常用的方式order-only依賴在更新目的目的文件曾經(jīng)存在時(shí),只需求根據(jù)依賴文件中的部分來決議目的能否需求被重建,而不是在依賴文件的任何一個(gè)被修正后都重建目的。依賴的改動(dòng)不會導(dǎo)致目的重建,稱為order-only依賴在書寫規(guī)那么時(shí),“or
19、der-only依賴運(yùn)用管道符號“|開場,左邊是常規(guī)依賴,管道符右邊的全部是order-only依賴。舉例LIBS = libtest.a foo : foo.c | $(LIBS) $(CC) $(CFLAGS) $ $ 等價(jià)于bigoutput : text.g generate text.g -big bigoutput littleoutput : text.g generate text.g -little littleoutput 多規(guī)那么目的Makefile中,一個(gè)文件作為多個(gè)規(guī)那么的目的出現(xiàn)。此目的文件的一切依賴文件將會被合并成此目的一個(gè)依賴文件列表,其中任何一個(gè)依賴文件比目的
20、更新比較目的文件和依賴文件的時(shí)間戳?xí)r,make將會執(zhí)行特定的命令來重建這個(gè)目的。 重建此目的的命令只能出如今一個(gè)規(guī)那么中。假設(shè)多個(gè)規(guī)那么同時(shí)給出重建此目的的命令,make將運(yùn)用最后一個(gè)規(guī)那么所用的命令,同時(shí)提示錯(cuò)誤信息假設(shè)目的的任何一個(gè)規(guī)那么沒有定義重建此目的的命令,make將會尋覓一個(gè)適宜的隱含規(guī)那么來重建此目的。多規(guī)那么目的舉例objects = foo.o bar.o foo.o : defs.h bar.o : defs.h test.h $(objects) : config.h 這是一個(gè)描畫規(guī)那么,僅僅用來描畫依賴關(guān)系foo.o和bar.o都是多規(guī)那么的目的,假設(shè)config.h文
21、件發(fā)生變化,那么foo.o和bar.o都會自動(dòng)重建。靜態(tài)方式規(guī)那么靜態(tài)方式規(guī)那么是這樣一個(gè)規(guī)那么:規(guī)那么存在多個(gè)目的,并且不同的目的可以根據(jù)目的文件的名字來自動(dòng)構(gòu)造出依賴文件。根本語法TARGETS .: TARGET-PATTERN: PREREQ-PATTERNS COMMANDS . -“TAGETS列出了此規(guī)那么的一系列目的文件-可以運(yùn)用通配符-目的方式TAGET-PATTERN-依賴方式PREREQ-PATTERNS-闡明了如何為目的文件生成依賴文件-生成方法:從目的方式的目的文件中抽取一部分字符(稱為莖)來替代依賴方式中的相應(yīng)部分。自動(dòng)生成依賴文件的過程在目的方式和依賴方式中,普通
22、需求包含方式字符 %。在目的方式TAGET-PATTERN中“%可以匹配目的文件的任何部分,方式字符“%匹配的部分就是“莖。比如目的“foo.o符合方式“%.o,其“莖為“foo。而目的“foo.c和“foo.out就不符合此目的方式。 每一個(gè)目的的依賴文件是運(yùn)用此目的的“莖替代依賴方式 PREREQ-PATTERNS中的方式字符“%而得到。假設(shè)依賴方式PREREQ-PATTERNS為“%.c,那么運(yùn)用“ foo替代依賴方式中的“%得到的依賴文件就是“foo.c。靜態(tài)方式舉例objects = foo.o bar.o all: $(objects) $(objects): %.o: %.c $
23、(CC) -c $(CFLAGS) $ -o $ 對目的foo.o,根據(jù)目的方式%.o,所以其莖應(yīng)為foo,運(yùn)用該莖,替代依賴方式%.c中的方式字符“%,因此foo.o的依賴文件就是foo.c命令行中“$和“$是自動(dòng)化變量,“$表示規(guī)那么中的第一個(gè)依賴文件。 $表示規(guī)那么中的目的文件foo.o : foo.c $(CC) -c $(CFLAGS) foo.c -o foo.o bar.o : bar.c $(CC) -c $(CFLAGS) bar.c -o bar.o 雙冒號規(guī)那么雙冒號規(guī)那么就是運(yùn)用“:替代普通規(guī)那么的“:得到的規(guī)那么雙冒號規(guī)那么允許在多個(gè)規(guī)那么中為同一個(gè)目的指定不同的重建
24、目的的命令留意:Makefile中,一個(gè)目的可以出如今多個(gè)規(guī)那么中。但是這些規(guī)那么必需是同一種規(guī)那么,要么都是普通規(guī)那么,要么都是雙冒號規(guī)那么。而不允許一個(gè)目的同時(shí)出如今兩種不同的規(guī)那么中雙冒號規(guī)那么和普通規(guī)那么的區(qū)別對于一個(gè)沒有依賴而只需命令行的雙冒號規(guī)那么,當(dāng)援用此目的時(shí),規(guī)那么的命令將會被無條件執(zhí)行。普通規(guī)那么呢?當(dāng)同一個(gè)文件作為多個(gè)雙冒號規(guī)那么的目的時(shí)。這些不同的規(guī)那么會被獨(dú)立的處置。就是說多個(gè)雙冒號規(guī)那么中的每一個(gè)的依賴文件被改動(dòng)之后,make 只執(zhí)行此規(guī)那么定義的命令,而其它的以這個(gè)文件作為目的的雙冒號規(guī)那么將不會被執(zhí)行普通規(guī)那么呢?雙冒號規(guī)那么舉例Newprog : foo.c
25、$(CC) $(CFLAGS) $ -o $ Newprog : bar.c $(CC) $(CFLAGS) $ ./foo foo : bar/lose cd bar; gobble lose ./foo 或命令執(zhí)行的錯(cuò)誤規(guī)那么中的命令在運(yùn)轉(zhuǎn)終了后,make會檢測命令執(zhí)行的前往形狀前往勝利,就執(zhí)行下一條命令出錯(cuò)前往形狀非 0,make就會放棄對當(dāng)前規(guī)那么的執(zhí)行,也有能夠會終止一切規(guī)那么的執(zhí)行。在命令之前加一個(gè)減號“-在Tab字符之后, make忽略此命令的執(zhí)行失敗。 clean: -rm *.o 即使刪除.o文件失敗,make也繼續(xù)執(zhí)行命令執(zhí)行的錯(cuò)誤在執(zhí)行 make 時(shí),假設(shè)運(yùn)用命令行選項(xiàng)“
26、-i或者“ignore-errors, make 會忽略一切規(guī)那么中命令執(zhí)行的錯(cuò)誤。但會提示有錯(cuò)誤出現(xiàn),并提示該錯(cuò)誤被忽略。后續(xù)命令能夠不能繼續(xù)執(zhí)行,退出make。運(yùn)用 make的命令行選項(xiàng)“-k或者“-keep-going ,當(dāng)出現(xiàn)錯(cuò)誤時(shí)不立刻退出,而是繼續(xù)后續(xù)命令的執(zhí)行。直到無法繼續(xù)執(zhí)行命令時(shí)才異常退出。在 make 執(zhí)行失敗時(shí),修正錯(cuò)誤之后再次執(zhí)行 make 之前,運(yùn)用“make clean明確的刪除第一次錯(cuò)誤重建的一切目的 。為什么?中斷make的執(zhí)行CTRL+C再次執(zhí)行make之前,請先運(yùn)用make clean來去除中斷make時(shí)產(chǎn)生的目的文件。make的遞歸執(zhí)行在 Makefile
27、 中運(yùn)用“make作為一個(gè)命令來執(zhí)行本身或者其它makefile 文件。普通用在一個(gè)存在有多級子目錄的工程中。舉例:當(dāng)前目錄下,包含一個(gè)子目錄subdir,子目錄中也有一個(gè)Makefile,當(dāng)前目錄下make時(shí),完成包括子目錄的一切編譯,在當(dāng)前目錄下的Makefile中,就可以運(yùn)用make的遞歸subsystem: cd subdir & $(MAKE) subsystem: $(MAKE) -C subdir 或變量MAKE在運(yùn)用 make 的遞歸調(diào)用時(shí),在 Makefile 中規(guī)那么的命令行中應(yīng)該運(yùn)用變量“MAKE來替代直接運(yùn)用“make運(yùn)用MAKE變量的目的保證最上層運(yùn)用的 make程序
28、和其子目錄下執(zhí)行的 make堅(jiān)持一致對某些make的選項(xiàng)不起作用subsystem: cd subdir & $(MAKE) make t時(shí),直接運(yùn)用make,和運(yùn)用MAKE變量,會有很大的區(qū)別。變量和遞歸上層Makefile中,運(yùn)用“export 變量名聲明的變量,會傳送給子make過程中。變量“SHELL和“MAKEFLAGS除非運(yùn)用指示符“unexport對它們進(jìn)展聲明,否那么在整個(gè) make 的執(zhí)行過程中它們會一直被自動(dòng)的傳送給子 make指示符“export或者“unexport的參數(shù)變量部分,假設(shè)它是對一個(gè)變量或者函數(shù)的援用,這些變量或者函數(shù)將會被立刻展開。并賦值給export或者
29、unexport的變量export的用法定義變量時(shí),同時(shí)進(jìn)展聲明。例如1. export VARIABLE = value等效于: VARIABLE = value export VARIABLE 2. export VARIABLE := value 等效于: VARIABLE := value export VARIABLE 不帶任何參數(shù)的指示符“export ,表示將此 Makefile 中定義的一切變量傳送給子 make 過程變量MAKELEVEL在多級遞歸調(diào)用的 make 執(zhí)行過程中。變量“MAKELEVEL代表了調(diào)用的深度。最上一級時(shí)“MAKELEVEL的值為“0、下一級時(shí)為“1、
30、再下一級為“2 : 命令行選項(xiàng)和遞歸在 make的遞歸執(zhí)行過程中。最上層可以稱之為主控make的命令行選項(xiàng)“-k、“-s等被自動(dòng)的經(jīng)過環(huán)境變量“MAKEFLAGS傳送給子 make 進(jìn)程。在主控執(zhí)行make時(shí)運(yùn)用“-k和“-s選項(xiàng),那么“MAKEFLAGS的值就為“ks“-C、“-f、“-o和“-W,這些命令行選項(xiàng)不會被賦值給變量“MAKEFLAGS定義命令包什么是命令包?類似C言語中的自定義函數(shù)語法格式:define 稱號命令塊endef命令包的運(yùn)用和對變量的運(yùn)用一樣foo.c : foo.y $(run-yacc) define run-yacc yacc $(firstword $) m
31、v y.tab.c $ endef 自動(dòng)化變量空命令規(guī)那么中,只需目的文件可以有依賴文件,但普通不用,但沒有命令行。這就是空命令規(guī)那么。格式:target: ; 運(yùn)用空命令行可以防止make在執(zhí)行時(shí)圖重建這個(gè)目的而查找隱含命令第7章 Make及makefile文件的編寫 1.概述2. Makefile3.Makefile的規(guī)那么4. 規(guī)那么的命令5.Makefile中的變量6.執(zhí)行make運(yùn)用變量/宏Makefile中的變量有如下特征1. Makefile 中變量和函數(shù)的展開除規(guī)那么的命令行以外,是在 make 讀取 makefile 文件時(shí)進(jìn)展的2.變量名是不包括“:、“#、“=、前置空白和
32、尾空白的任何字符串,但建議只運(yùn)用字母、數(shù)字、下劃線3.變量名是大小寫敏感的4.自動(dòng)化變量。變量的援用“$VARIABLE_NAME或者“$ VARIABLE_NAME 來援用一個(gè)變量,變量的援用展開過程完全和 c言語中的宏展開的過程一樣,是一個(gè)嚴(yán)厲的文本交換過程。objects = program.o foo.o utils.o program : $(objects) cc -o program $(objects) $(objects) : defs.h program : program.o foo.o utils.o cc -o program program.o foo.o util
33、s.o program.o foo.o utils.o : defs.h 展開后兩種變量定義一個(gè)變量的定義有兩種方式或者稱為風(fēng)格遞歸展開式變量 直接展開式變量變量的這兩種不同的風(fēng)格的區(qū)別在于:1. 定義方式;2. 展開時(shí)機(jī)。遞歸展開式變量變量的定義運(yùn)用“=或者“define指示符來定義在援用的地方是嚴(yán)厲的文本交換過程假設(shè)此變量定義中存在對其他變量的援用,這些被援用的變量會在它被展開的同時(shí)被展開foo = $(bar) bar = $(ugh) ugh = Huh?all:;echo $(foo) 執(zhí)行make時(shí),顯示“Huh?交換過程為:首先“$(foo)被交換“$(bar),接下來“$(ba
34、r)被交換為“$(ugh),最后“$(ugh)被交換為“Hug?。整個(gè)交換的過程是在執(zhí)行“echo $(foo)時(shí)進(jìn)展的。 優(yōu)缺陷優(yōu)點(diǎn):可以援用其它的之前沒有定義的變量,能夠在后續(xù)部分定義,或者是經(jīng)過 make 的命令行選項(xiàng)傳送的變量缺陷:1.能夠會由于出現(xiàn)變量的遞歸定義而導(dǎo)致 make 墮入到無限的變量展開過程中,最終使 make 執(zhí)行失敗。例如x = $(y) y = $(x) $(z) 2.假設(shè)援用了函數(shù),那么函數(shù)總會在其被援用的地方被執(zhí)行。直接展開式變量運(yùn)用“:=來定義的變量該類型變量值中對另外變量的援用或者函數(shù)的援用在定義時(shí)被展開不能實(shí)現(xiàn)對其后定義變量的援用引薦運(yùn)用這種方式定義變量x
35、 := foo y := $(x) barx := later y := foo bar x := later “?=操作符只需此變量在之前沒有賦值的情況下才會對這個(gè)變量進(jìn)展賦值FOO ?= bar 假設(shè)變量“FOO沒有定義過,就給它賦值“bar。否那么不改動(dòng)它的值追加變量的值在便令定義時(shí),賦給一個(gè)根本的值,后續(xù)根據(jù)需求,給它添加一些必要的值運(yùn)用“+=操作符objects = main.o foo.o bar.o utils.o objects += another.o 會把a(bǔ)nother.o追加到objects的末尾,并以空格分隔目的指定變量在Makefile中定義一個(gè)變量,這個(gè)變量對此Ma
36、kefile的一切規(guī)那么都是有效的。是一個(gè)“全局的變量。另一種變量是目的指定變量“ Target-specific Variable。允許對于一樣變量根據(jù)目的指定不同的值,目的指定的變量值只在指定它的目的的上下文中有效。此種變量是“部分的。.設(shè)置一個(gè)目的指定變量的語法為: TARGET . : VARIABLE-ASSIGNMENT 或者: TARGET . : override VARIABLE-ASSIGNMENT 目的指定變量闡明“VARIABLE-ASSIGNMENT可以運(yùn)用任何一個(gè)有效的賦值方式,“=遞歸、“:=靜態(tài)、“+=追加或者“? =條件。運(yùn)用目的指定變量值時(shí),目的指定的變量值
37、不會影響同名的那個(gè)全局變量的值。只對指定的這些目的有效目的指定的變量變量會作用到由這個(gè)目的所引發(fā)的一切的規(guī)那么中去。prog : CFLAGS = -g prog : prog.o foo.o bar.o 對于目的“prog以及其所引發(fā)的一切包含目的為“prog.o、“foo.o和“bar.o的一切規(guī)那么規(guī)那么,變量“CFLAGS值都是“-g。 目的指定變量舉例 # sample Makefile CUR_DIR = $(shell pwd) INCS := $(CUR_DIR)/include CFLAGS := -Wall I$(INCS) EXEF := foo bar .PHONY : all clean all : $(EXEF) foo : foo.c foo : CFLAGS+=-O2 bar : bar.c bar : CFLAGS+=-g . . $(EXEF) : debug.h $(CC) $(CFLAGS) $(addsuffix .c,$) o $ clean : $(RM) *.o *.d $(EXES) 運(yùn)用目
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出兌攤位合同范本
- 別墅設(shè)計(jì)合同范例
- 個(gè)人門窗施工合同范本
- 鄉(xiāng)村空房轉(zhuǎn)讓合同范本
- 第7課《敬業(yè)與樂業(yè)》教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版語文九年級上冊
- 加盟金額寫入合同范例
- 保本合同范本
- 切割加工項(xiàng)目合同范本
- 企業(yè)贊助活動(dòng)合同范本
- 交技術(shù)合同范本
- 初中英語 滬教牛津版 9A U7-1 Reading Tom Sawyer paints the fence 課件
- 騙提個(gè)人住房公積金檢討書
- 監(jiān)控系統(tǒng)維保方案計(jì)劃及報(bào)價(jià)
- 無線通信與網(wǎng)絡(luò)復(fù)習(xí)資料
- ABCD2評分量表(TIA早期卒中風(fēng)險(xiǎn)預(yù)測工具)
- E-learning平臺使用手冊(培訓(xùn)管理員版)
- 自動(dòng)化物料編碼規(guī)則
- 人教版小學(xué)數(shù)學(xué)五年級下冊教材分析
- 小學(xué)音樂教材分析
- 委托收款三方協(xié)議
- 黃岡市2021-2022高一上學(xué)期期末考試數(shù)學(xué)試題及答案
評論
0/150
提交評論