平安集团银行信用卡大前置系统技术建议书_第1页
平安集团银行信用卡大前置系统技术建议书_第2页
平安集团银行信用卡大前置系统技术建议书_第3页
平安集团银行信用卡大前置系统技术建议书_第4页
平安集团银行信用卡大前置系统技术建议书_第5页
已阅读5页,还剩325页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

makeLinuxGNUmakeunixGNUmakeMakefileMakefile处动”旦提供通确做唯shell提输全动极高效它解释Makefile指有Makefile有书式有Makefile提供MakefileMakefileGNUmakeGNUmakeRedHatFC3LinuxGUNCmakeCshellmakeMakemakemakemakemakeMakefile查决义过会被make依

准备知识开始于make讨论之首先明确基概把级写换别令生指令被机识别但查高级、函数与变声明确、量定确间标通高级标标Linux默认缀“.o”“”标“”标区别.o链将多o.o和库链接被操环格式ELF”格式接查数.o文的定义的号。将.o文件中使用数和其.o关符号行合并,所有件中的符进行新安排(定位,并链接统相关文(程序启文件等)终生可执行程。链过程使的“ld工具。静态库:又称为文档文件(ArchiveFile)。它是个.o文件的合。Linux中态库文件后缀“.a静库中的个成(.o文件没有特殊的存在格式仅是一个.o文件集合。用”工具护和管静态。共库:.o集合,但.o文时编的方生成Linux中,共格“ELF”格式。共库已经具备了可执条件)。模块中各个成员的地址(变量引用和函数调)都是相地址使用此共享的程在运行时,共享库被动态加载到内存并和主程序在内存中进连接。个可执程序可共享库文件的代段(多程序以共享使用库中某一个块,共代码不共享数据)。另外共享的成员象可被执行(由供支持。参考ld了更加详细关于说和用法。2

make绍Makefilemake以译源代码和链接程序。典型地可执行文件可由一.o的顺者更。如果你的程中已经在一活着多个确的Makefile。当对工程中的若干文件修改以后要根据修改来更新执行文件或者库文件正如前面提到的你只需要在shell执行”make会动根据修改情完成源文件的对应.o文件、文件、最可执更新。通比较应件(则目标依,)的最改时间决哪文件需要更新、那些文件不需要新。对需要更新的文make就数库中所的相令(在make读取akefile后会立编译过描述数库。此库中记所有个文件之相互关系以及们的关系描述来重建它,对于不需要重文件make什么也不做。而且可以过make的命令行选来指定需要重新译文件。ProblemsandBugs=================IfyouhaveproblemswithGNU`make'orareportittothewecannotpromisetodoanythingbutmightwellwanttofixit.Beforereportingabug,makesureyou'veactuallyfoundrealrereadthedocumentationandseeifitreallysaysyoucandowhatyou'retryingtodo.Ifit'snotclearyoushouldbeabletodosomethingornot,reportthattoo;it'sainthedocumentation!reportingbugortryingtofixityourself,trytoisolateittothesmallestpossiblemakefilethatreproducestheproblem.sendusthemakefileandtheexactresults`make'gaveyou,includinganyerrororwarningmessages.Pleasedon'tparaphrasetheseit'sbesttocutpastethemintoyourreport.Whengeneratingthissmallmakefile,besuretonotuseanynon-freeorunusualtoolsinyourcommands:youalmostalwaysemulatewhatsuchtooldowithsimpleshellcommands.Finally,besuretoexplainwhatyouexpectedtothiswillhelpusdecidetheproblemwasreallyinthedocumentation.Onceyouhaveapreciseproblemcanreportitoneoftwosendelectronicmailto:oruseourprojectmanagementtool,additiontotheinformationabove,becarefultotheversionofyouareYoucangetthisinformationwiththecommand`make--version'.Besurealsotothetypeofmachineandoperatingsystemyouareusing.Onewaytoobtainthisinformationisbylookingatfinallinesoutputfromthecommand`.以上时GNUbugGNU中。发现。。!

介在执行为Makefile的特殊文件(本文的后作为这特殊文件的件名)来告make需什么(成什么任),该么做。通常,make工具主被用来进行工程编和程序接。节将分一个简的对一包含个的源代码三个头件的工进和链Makefile提供给了make必要的信息make程序根据的规则、清等复的Makefile我们会讨。当使用make工具进行译时工程中以下种文件执行make会(重编):所没则对各C并生成最后的可;每个在上次行make之后修改的C代码文件在本次make时会重新编译;头文件在上一次行make之后被修改。所有含此文件C文件在本次行时将会重。后两种情况是make只将修改过的C源文件重新编译生.o文件对于没有修改的文件不进行任何工作重新编译过程中任何一个源文件的修改将产生新的对应的.o文新的.o文件将和以前的已经存在、此次没有重新编译.o文件重新连接生成最后的可执行程序。首先让我们先来看一些Makefile相关的基本知识。

绍的Makefile描::COMMAND:规的目。通是最需要成的件名者为实现个目而必的中间程文名。可以是.o件、也可以是最后可执行程序的文件名等。另外,目标也可以是一个make执行的动作的称,如目标”我们称这样目标是“”。prerequisites:规则的赖。生成规则目标所需要的文件名列。通常一个目标依赖于一个或者多个文件。:则的命令行。是规则所要执行的动作(意的命令或者是可在shell下执行的程序)。它定了make执这条规则时所需要的动作。规则可有多个令行,一条命占一行。一个命以[Tab]符告照令成应动是书写。以如Makefile“clean,它定义用make过间文进清作。在“规”就什如通则中包了标的依赖关(目的依文件)和重建目标命令。行命令,来建或者重建规的目标(目标件也可以触发这个规则的上一个规则中的依赖文)。规则包之关所。一通外的很东(续我展Makefile只包则。则在Makefile来非常复么它。程据规的依关系决定否执规则所义命令过程们称之为执。

简单的示本开始我们在中的此个文件和8个C文件成我们书的Makefile,来描述创的执“edit,执行件8个文和文。Makefile容下::\cc-o\:cc-c:cc-c:cc-c:cc-c:cc-c:cc-c:cc-c:cc-cclean:rm\MakefileMaekfileeditMakefilemakemake.omakecleanMakefiletargetedit.o.h.o.c.hcc–cc–c规则任何被修改make会被重新编或者新何果必要则首会被重新编译。在这个例子中,“edit”依赖为8.o文;而“”依文件为“””当”或“”修改以再次执make”“就被更(其它的.o文不被更)同时“的更将导致“edit”被更新。在描依赖系行下通就是则的命令行存一些些没有命行)命令行定义规的动作如何据依件来新目文件。命行必[Tab]键始,以和Makefile其他行区。就是说[字符开,但不是有的以键现行是命行。但make程把第之[字开始的行都作为命令行来理(记:make程对标文件的更需你规则描述中提供正确的命“make”程序的就目标需更时行规则所义的)。目标“”是个文,它仅代执行个作的识。常情下,需要执行个规所义的作,此目clean”没有现其它何规的依列表。因执ake时它指定动作执行除非执行make确地定它。而且目标“”有任何赖件,它有一个目的,是过这个标来执行所定义的命令。Makefile中。需执行“clean”标所义的令,shell下输入:makeclean。

默,make执行的是akefile的规此的目“Makefile最终需更或。上例的M目标“edit”是目因make的“极目标”。当修改了任C源文件或者头文件后,执make将会重建终极目标edit”。当在shell提示符下输入“make”命令以后make取当前目录下M文,并将Makefile件中的第个目标作为其行的“终极目”,开始理第一个规则终极目标所的规则)。我们的例子中,第一个规则就是目标“”的则。描述了“的赖关系,定了接.文件生成标“edit”命令;make在行这个规则所定义的命令之前首先处理目标“edit”的所有的依赖文件(例子中的那些件)的新规(以这些.为目规则这些.o文件为目标的规则理有下列三况:目标.o文件不,描述则创;目标.o文,.o文件所的.c源件中任何个比目标.o文件“更新”(在上一m之被修改)。则根据规重新编译生成它;目标.o文件存在目标.o文件比它的任何一个赖文件(的c源文.h文更新”(它的依赖文件在上一make之后有被修改),则什么也不做。这些.o文件所在的规则之所以会被执行,是因为些.o文件现“”的赖在Makefile中个规目标果不终极”所赖的者“极目标的赖文所依那么这个则将不会被执行除非明确指定执行这个规(可以通make的命令行指定重目,么个标的规则就会被执行,例如clean”)。在译或者重新编译生成一个o文件时,make同样会去寻找它的依赖文件的重建规则(是这样一个规则这个依赖文件规则中作为目标出现),在这里就是.c和h文件的重建规则上例的中有哪个规则的目标.c或者h文件以没有重.c和.h文的规言语序文以使工具Bison或Yacc来成(具体法可参考相应的册)。完成了对.o文件的创第一次编译者更新之后make程序将处理终极目”所在的规则,分为以下三种情况:目标文件“edit”不存在,则执行规则以创建目标”。“edit”存,其依件中有一个者多个文件比更新”,则根据规则重链接生“edit”3.目标文“edit存在它比它任一个依件都“更新”,则什么也不做。上,如改源文“执make,“将被更,之终极将会重生;如果我们改了头文件“”之后运”那么““””将会重译,同极目”将被重生。以个的例介Makefile目和关下于个M文件”先解析终极标所规则(上例子中的第一个规则),根据其依赖文(例中第一个规则的个.o文件)依(按依赖文件列表从左右的顺)寻找创这些依文件的规则。首为一个依赖文件()寻找创建规则如果第一个赖件依赖于其它文(、),则样为个依赖件寻找创规则(创和的规则,常源件和头文已经存,也存在重它们规则)…直到为所有依赖件找到合适的创建规则。之后make从最后一个规则(上例标为的规则)回退开执行最终完终极目标第一个赖文件创建和新。后对第二、第三个第四……极目标的依文件行同样过上的创建者更新每个规则赖文件过程都这样一个过类于语言中递归过程)对于任意一个规执行过程都是按照依赖文件列表顺序,对规则中每一个依赖件,使用样方(按照同的过)去重建,在成对所有赖文件的建之后,后一步才重建规则的目。更新或者建)终极标的程中,如任何个规则执出现误make就立即报错并退出整个过程make只是负责执行则,而对体规所描述的赖关的正确性、规则定义的命的正性不做任判断就是说,个规的依赖关是否正确描述重建标的规则令行否正确,make不任何错误查。给makeMakefile中赖。

指定变量同样是上边的例子,我们来一下终极目标“edit”所在的规则::\cc-o\这中.o文件列表现了;第次:为目标列出现,次:命令中作”参数列这样做所带的问是:果我需“edit”加一个的依赖文件,我们就要在两个地方添(依赖文件列规则命中。加时能“edit”的赖列表中加入、但却忘记了给命行中添加,或相。就后期的维护和修改来了很多不方便,添或改出。为了避免这个问题实际工作中大家都比较认同的方法是一个变“OBJECTS”、”、””者“OBJ来作为所有.o文的列表的替代。用到些件列地,使此量来替。上例Makefile中我们可以添加样行=\“objects”为一个量,它表所有.o文件的列表。在定了此变后,我就可需些.o文件列地”来表示它,而不需要罗列的.o文件列可第六使用)的规样=\:$(objects)cc-o$(objects)…….…….clean:rm当我们需要为终极目加或者掉一.o依文件需要改“objects”的加入若干.o文件)。这样做不但减少写的工作量,且可以减少修改而产生错的可能。

自动推导规则在使用make编译.c源件时.c源文件规则的令可不用给出是因为make本.件的编译生成应的.o文件。行“cc-c来译c源在Makefile中只给需要重文一个),make这寻找的依件(的c文件名后缀外,余都同的两个件)而且使用确的令来重建个目标文。对于上边的例子,此默认则就使用命令“cc-c-o”创建“”一个文件是“”,倚赖文件是“的规则,完全可以省略其规则的命令,而由ake自用为make的这Makefile时,就..o依赖关系的规则,需要给出那些特定的规则述(.o标所需要的.h文件)因此上边例子就可以以加简单的方式写,我们同样用变量objects”。Makefile内如下:#=\:$(objects)cc-o$(objects)::::::::.PHONY:clean:rm的Makefile(于目标”的详细说我们在后边进行)make隐实工的make中会经常使用,使得过程方便。几乎在所有的Makefile中都用到make隐含规,隐一。后续会讨。

另类风格的MakefileMakefile。在这Makefile的Makefile就可以这样来:=\:$(objects)cc-o$(objects):::例子头文“”作所有.o文的依件。其文件作应则的目中所举所有o件的赖文。但Makefile并值借。问在于:同赖放在同一个规则中进行描述(一个规则中含有多个目标文件),这样导致规则定义不明了,比较混建议大不要在Makefile采种方式了书写否后期维会一件非常痛苦的事情。书写规则建议的方是:单目标,多依赖。就是说尽量要做到个规则中只存在一个常且Makefile会。

清除工作目录过程文件规则了完源代编译外,可以其它务。如:边提的为实现清除当目录编译程中生的时文edit和哪些.o文件)规则:clean:rm在实应用,我把这规则成如微复一些样子以防出现料未及的情。.PHONY:clean::通“.PHONY特目标声明为伪目标。磁盘个名”令无。2.在命令用”意思“rm”的执行错误。Makefile中将Makefile的第。因为们的衷并是当在命行上入make以后执行删除动作是要建程序我们的例中。在输make以后要要对目标建。上中因为目标“clean”有出现在终目“edit”依赖关系中终目标的直接依赖或者间接依赖),所以我们执行“时,标”在规将会被理。当需要执此规则要在make的命令行选项中明确指这个目标(执行“clean”。关于ake的行可参考

指定终极目标。3

Makefile述

容的Makefile中,包含了个示符和。关“则”“”指示”后的章的讨论本是些。显式规则:述在一个个的件akefi标文件)书写Makefile时需明确地给出标文件、目标的依赖文件列表以及更目标文件所需要的命令(有些规则没有命令,这样的规则只是纯粹的描述了文之间的依赖关系)。它ake根据类目标件(是根据后缀)动推出规则。make根据标文件的,自动产生目标的依文件并使用默认命令来对目进行更新(建立一个则)。变量定义:一个字符字符串代一段串当定义了一个变量,Makefile后续在要使用文本串地方,过引用个变量实现对本串的使。一章的例子中,们就义了个变示.o文件列表。Makefile指示符:符指明在make程序读文件所行个动:读取一个文件,读取定文名的件,将其内容作为akefile文件的一部分。决定通常根据个变的)或者Makefile中的定分。定义一个多行变量。注释:Makefile“#字后内容作是释容和shell脚本一样)处理。如果此的第一个非空字为“#么行为注。的结存在反线(\,那么下也被作为释行一般在书Makefile时推荐将注释一行Mefil行一中。在Makfi,可以使反斜线加“”)来实现(对特殊字“#”的转义),其表示将“”作为字符而不是注释开始志。需意:Makefile第规以Tab]字make程序都会将其交给系统shell程序解释执行。因此,以字符开的注释行也会被给shell来理此命令是否需被执行执或者忽略)是由统程来决的。另外,示符“define”义一个多行变量者命令时,其义体(“define和“”间的内容)会被完整的展开到中用此变量的地方包含定义体中的);make在引此量的对所有的体行处理,决定是释还是效内容Makefile中的引用和语言的类但是其实质不同将细讨论。对变量引所的是将这个量根据定义进行基于文本的展开,展开变量的过程不及到任何变量的具体含义和。

makefile文命的下make会作执行make的下序makefile文并执,的文为“GNUmakefile“makefile”。makefilemakefileREADME,ChagelistGNUmakeMakefilemake释makefile需make-f选项来给makefile式:NAME—file=NAME执makemakefile也多-f--file选项多需makefile多照顺进链接并make执-f--filemakemakefile就再自动查:1.源自动执:–c–o2.如是make对.o文件目标则中文件在。“make到:make:ruletomake‘Stop.3.如果直“得信:make:Notargetsfound.Stop.

包含其它makefile文件本何在一个M包其件。Makefile中包含其它文件所需要使用的关键字include,和c语言对头文的包含方式一致。“”指示符告诉make暂停,而”指定的一个或者多个文件成后再继续当前Makefile的读取Makefile中指示include”书写在独立的一行,其形如下:FILENAMES...FILENAMES是shell所支持的文名(可以使用配符)。指示符“”所在的可以一或多空(make程在处理时将略些空格切能字符开一[Tab]字符ake程序将此行作个行来处指符“include”和名之空键隔开行尾空字符处被忽略用指符含进来Makefile中,如果存在变引用。它们将会在包含它Makefile被)。来三个.mk文件、、,$(bar)被“bishbash”。则于之前已经提到过程序在处理指示符include时,将暂停对当使用指符nlumakefile文件,而include”符指定文件表直完所有文件回头续读指示“include在的akefile文件。通示符在以场合有多个由来需要使用组通用的变定义或者式规则。通的做法是这些共同使的变量在,在使用的Makefile使用指示符。2.当根源文件自动产生依文件时;我们可以将自动产生的依赖系保存在另外一个文件中,主akefile使用符“include”包这些文。这的做法直接在主Makefile追加赖文件的方法明智的多。其版本的make已经使用这种方式来理。如果指示符include”指的文件不是以斜线开(绝对路径,如/usr/src/Makefile...而目不此根以下查找命令行选“-I或“--include-dir定,如果找到指定的文件,则使用这个文件;继续依此下几个目录(如果其存在):“/usr/gnu/include”“/usr/local/include””。当在些录都有到“include”指定文件将会提示一包含文件未找到告警示,是不立刻出。继续理Makefile的后内容当完读取整个Makefilemake将试图使用规来创通过示include指定的但未找到的文件,make将示致错误退出。会出类似如下误提:Makefile:错误的行数:未找到文件名:提示信息suchfileor)Make:No‘<filename>’.常在Makefile中可使用“来代替“”,来于包含文件不存或者无法创建时的错提示(“-的意思是告诉m忽略操错误。继续执)。像边那样:-includeFILENAMES...使用种方式,当所要含的件不存时不会有误提也;此和种以两比:使用“include,程序处理,果“”表中的任何一个文件不能正读取而且存在一个创建此文件的规则时make序将会提示错误并退出。使用“-includeFILENAMES...”情况是,当所包含的文件不存在或者不存在一个规去,make程序会继续执只真正由能正确完终极标重时(某些必的标在前读makefile文件内容中找正确的重建规则),才会示致命错并退。为了和其它的make程进行兼容。也可使用“sinclude”“(GNU支持的方)。

变量M如果当环定了个”境变量执时首先将此变量的值作为需要读入的文,个文之间用格分。类使用示符“include”包含其Makefile文件一,如文件绝对而且前目不在此件,make会在一些目录去找和使”的区:1.环指定makefile文件中的“目标不会make执行的“终极目标”。就目make不其作为“。如果在make的为Makefilemakefile”或者的文件,make同样提示“make:***Notargetsspecifiedfound.的目存件(”、“makefile”或者“GNUmakefile”)那make执时“终极目”是前录下这个文件中所定义的“终极目标”。2.环境变量所定义的文表,行make时,如不能中某一文件存在或者无法创建)。make不会提示错误,不退出。就是说环境变量“”定包致make错误(这是比较隐蔽的地。3.make在执行时,首先读取是环境变量“”所指定的文件列表,之后才是工作目录的makefile文件,“include”所指定文件在ake发现关键字的时、暂停在读取的文件转去读取include”所指定文件。变量”主要用在“”的递归调过中的信。实际应用中很设变量变makemake取“MAKEFILES量不,我以使环境来指定定义“隐则”的文件比如设置默认搜索路径;通过种方式设置的“隐含规则”和定义的变量可以被任何ake进程使用(有点象C语言中全局变量)。也有想让login程序自动的在自己的工作环中设置此境量,编写Makefile建立在环境量的基础上。此想法可以肯定地说不一个好主。规大家千万不这,则在人工作环境中肯不能正常工作因为别人的工环境中可能有设置相同环境变量“MAKEFILES”。推荐的法实:在需要包含它makefile文件时使用示符“include”来实现。

变量make程个akefile文包由“MAKEFILES指命行、当前工作下的默认的以及使用指示符”指定包含的,在件进行执行前make读的文件将会被自动到量MAKEFILE_LIST”的定义中。变当mak正的makefi。地是一个文件中如果使指符“include包含,变量“MAKEFILE_LIST”的一个可能示“include”指定所含个makefile的如下::=$(MAKEFILE_LIST)),$(MAKEFILE_LIST)):=$(MAKEFILE_LIST)),$(MAKEFILE_LIST))@echo=$(name1)=行make,则看到的将是如下:==了make的函数的和变量。

其他特殊变量GNU支持一个特殊变量,此变量能通过任何途给它赋值。它展开为一个特定值。个重的特的变是。它被开以后是引文所定义的所有全局变量列表。包括空变量未赋值变量)和make的内嵌变量,但不包含目标定的变量,目标指定变量值在特目标的上下文有效。

makefile文件的重建Makefile可由其文件生,如RCS或SCCS文。如果Makefile由文件重建,那在在这Makefile要重后Makefile不的Makefile。make的过是这的:makemakefilemakefilemakefilemakemakefilemakemakemakefile写使依命双make定令无makefilemake双冒号无条得make陷断、、防止情况发生make到双号忽略其MAKEFILES”指定指include”指定makefile定义类双“指make序缺省-f无工录下否缺省名称省通创创缺makefilemakefilemakefilemakemakefilemakefilemakemakefilemake-tmakefilemakefilemakequestion-njust-printmake–fmfile–n首mfile、取之打印出所但真makefile们makefile作最–t防makefile作-t参数makefilemake––nfoo取打印出、foo实任何且所印-fmfile所

重载另外一个makefilemakefile(makefile-A)需要使用另外一个makefile-B“makefile-A使用指示“mkaefile-B达到目的使用这种方式在两个文件存在相同目,而在不同文件中其描规则使用不同命令这样,相目标就时不同命这makefile不的。遇到这种情况,使用指示符“include”然是行不通的。make提供另外一种途径来实现此目的。体的做法如下:在需要包含的makefile文件(makefile-A)中称匹的规则它来那些在“makefile-A”没给出明创建则的目重建则。就说,如果在当前m文件不找重一目的规时就用所匹配式”所在规来建个标。看一例如果存在个名“Makefile的文其描述”的则其他的一些规我也可书个内如下命名为“GNUmakefile”的文件。>%:@$(MAKE)$@;执行命令foo,make将使工作目下命名为“GNUmakefile”的文件并执行目标“”foo是>”如果行另外个命“makebar”因在“GUNmakefile”中没有此目的更新规则。make使用“所有匹模式”规则,执行命令“$(MAKE)Makefilebar”。如文件“Makefile”执行它NUmakeiakefi“foo建于make执行读件”在其能够到目“ake就不会这“中目在规样就避免了使用指示“include”包含一个makefile文件时所带来的目规则的复定义问题。此种方式模式规的模式只使用了单独“”(我们称他为“所有模式匹配规则),它可以配任何个目标它的依是“force”,保证了即使目文件已经存在也会执行这个规(文件已在时需要根据的依文件的修情况定是需要重建这目标文件;“force”规中使用空命令是为了防止make程序试寻找一规去建目标“force”时,使用了模式则%:force”而陷入无限循环。

析makefile文make的执过为个。一取所的akefile文“MAKIFILES量指定示“include指、以及”指定的文件),建所有的规含依赖之。在阶段根据一段已经建依赖决定标需更新并使用则来建这标。理make执过程的两阶段是很重要。它能帮助我更深入的了解行过程中变量以函数如何展开。变和函展开题是写Makefile时容大家迷的地方之。本将对这些同的构的展开段进简单的总(明确变和函数的展开段,对正确的用变量非常有助)。首先,确以下基本的念;在make执行的一阶段中果变和函数被开,么称此展是“立即”的,此时所有的变量和函数展开在需构建结构链表对应规则中(此规则在建立链表是需要使用)其他为的会“而直规须或在make处理的第二阶段才。可现在讲还不完没关通过后内容学会步步的熟make学可以回头本内相信在看完后,会对的整个过程有全面深入的理解3.9.1变量取定解析规:==IMMEDIATE:=IMMEDIATEIMMEDIATE+=DEFERREDIMMEDIATEEndef当变使用加(+=)时,如果前个变量是个单变量使用义的)则认为它是立即展开的,其它情况时都被认为是“延后”展开的变量。3.9.2条语句所有使用到条件语句在产生分支的地方make程会据预设条件将正确地分支展开。就是说条件分支的展开“立即的其中包括“ifneq”所确定的有分支命令。3.9.3则的定义所有的规在ake执行时,都照如下的式展开::;其中规中目标依赖果引其他的变量,则被立即展开。而规则的命令中的变量引会被延展开。模板适所有规则,包括确规、模式、后缀则、静态模规则。3.10

总结make的行过如下:1.依次取变量定义的makefile件列表读取工作目录下的makefile文根据命名的查找顺“GNUmakefile“Makefile”,首先找到那个就读取那个)依次读取工作目录makefile文件中使用指示符“”包含的文件重所有规(如目标读某个makefile文件,则执此规则重建此makefile文,完成以后从第一开始重新执行)初始化量值并开那些需要立即展的变量函数并根据预设条确定执分支根据“极目标以及其他目标的依关系建依赖关系链表执行除“终极目标”以外的所目标的规则规则中如果依赖文件中任一个文件的时间戳比目标文件新,使用规则所定义的命令重建目标文件)8.执行“终极目标”所在的规则说明:执行一个规则的过程是这样的:对于一存在规(明规则隐含则)先,make程序将比较目标文件和所有依赖文件的时间戳。果标的时间戳比所有依赖文件时间戳新(依件在一次执行之后没被修),么什么也做。则(依赖文中某一个者全部在一次执行ake已经修改过)规则定义重建目标的命令被执行。就是ake工作的基础也是其执行规所定义命令的据。(后续讨规则时将会对详细地说明)4

的规则Makefile的一关重要,规述了何种况下用什命令重建个特的文,此件被称规则“目标(通规则的目标只有一个)。规则中出目标之外罗列其它文件称“目标”依赖而规则命令是来更新或者创建规则的目。除了makefile的“终极在以其规顺在makefile件中没有意义“终极目标就是没有使用make命令行指定具目标时,默认的更新哪目它m第一目。如makefile第有个目标话,那多个目中的第个将会作为make“极标。有两种情况的例:1.目名以号“开的并且其后不存斜线““./被认为是当前录“../被认为是上一级目录;2.模规则的目标。这种目标所在的则是akefile的一个规则时,它并会作为“终极目”。“ake的唯一目的,其所规则作第个被执规则而其它的规则是在完成重建“终极目的过程中被来的。所以这些目标所在规则在Makefile中的顺序无关紧要。因此makefile第一应重整个程个程的依系命。

一个例子我们来看一个规则的例子::#cc这是个典的规。看这个子,应该够说这个则的个部之间的关系不过们还要把个例拿出论。的是我们加明地理解Makefile的规则本例第一中,件“”是则需重建的文,而“”和“”是建“所要使用的文件。我们把规则所需要重建文件称规则“目标”(),而把重新目所需要的文称为规则“依赖(或者标的依)。规中的二行“cc-c”是规的“命令。它述了何使规中的依文重建标。而且上面规则告我了两事:1.如定标件是否期(需要重建目标)过期是指目标文件不存在或者目标文件“”在时间戳比依文件中的任何个(”或者“”)老”。2.如何建目标件“”。这规则中使用cc编译器。规则的命中没有确使用到依件“”。们假在源件“”中已经包含了此头文件。这也是为什么它作为目标依赖现的原。

规则语法通常规则的语法格式如下::PREREQUISITESCOMMAND或:;COMMAND规则中“TARGETS”可以空格开的多文件名也可以是一个签(例:执行清空“clean的文件名可以使格“A(M)表示(Linux下库a文件)的成“M(于静态库的重建参考第十一章使用新静态库文件。通常则只有一个目标文件(建议这么做)偶尔在一个则中需多个目标。书写则是我们要注意的点:1.规的命令部分两种写方式a.命令可以和目标:依赖描述放在同一行。命令在依文件表后使分号;)依赖件列分。b.的描述的下一行,作为独作为独立的命令行此必以[Tab]字符开始在M,第个则之出的有[Tab]的被2.Makefile中符号“$”有特殊的含义(表示变量或者函数的引用),在规则中需要使用符号“$”的地方,需要写两个连续的(”)。3.前边已提过,对于M中一个较长行,我可以使反斜线“\”其书写到几独立物理上。然make对Makefile本行的最大度是没有限制的,但还是建议这。书方更有的这也是一个的现)。一个规则告诉“make”件:1.目在什么情下已过期;2.如需要建目标时,何去重建个目。目标是过期由那些使空格割的则的依赖文件所决定的。目标文件存在者目标文的最修改时间依赖件中的任一个时,目标就会创建或者建就说执行则命令行的前提条件是以下两者之一1.标文件不2.目标文件存在,但是规则的依赖文件中存在一个依赖的最后修改时间比目标的最后修改间晚。规的中思是处动则的令重目提了法这些命运在统hell之上

依赖的类型在GNUmake的规则中可使用两种不同类型的依赖1.以前章节所提到的规则中使用的是常规依赖这书写Makefile则时最常用的一种另外一种在我书写时不会使用比较殊、为“order-only”依赖。一个规则的常规依赖(是多依赖文件)明了件事:先,它决定了重建此规则目标所要执规则切的说是执命令)的序;明在新这个规则的目标(行规则的命令)之需要按照什的顺序执行那些则(令)重建这些依文件对所有依赖文件重建,使用明确或者隐含规则。是说于这样的规则:A:B,重建之前,先需要对它和C的重建。重建B和的就行Makefile文件BC为目标规)其,确定依系中比,则为的而需通如规中一被则规的相应。(目标文件已经存在)时据依赖文中的部分决定标是否需被重,而不是依赖件的任何个被修改都重建目。为了实这一的,相应就需对规则的赖进分类,一是在这些赖文件更新后,需要更新规则的目标;另一类是新这些依赖的,可不需要更新规则的目标。”书“order-only”使号“”始作标的个依文件规则赖列表中管道“|常依管道符边是“order-only”样的书写格下:TARGETS:NORMAL-PREREQUISITES|ORDER-ONLY-PREREQUISITES这样规则中常依赖件可以空;同样也可以对一个目进行多次追依赖需要注意:规则依赖文件列表中如果一个件同出现在常列表和order-only”那么此件被作常规依处理(因常规依赖所实现动作”所现动超)。“order-only”使:=foo:|$(CC)$<make执“foo经存修以“foo”将会被重建,但是当“”被修改以。将执规的命重目“foo”。就说规则中依赖文件$(LIBS)只有目文不在情况才会与则执行当标件在此赖会参则执过程。

文件名使用通配符Maekfile中表示文件名可用通配符。可使用通符有”“”和“”。在M中通配符用法和含义和Linux(unix的全相。例如”代了当前目录所以“.c”结尾的文件等但是在Makefile中这并是可以用在,Makefile中统配符以:以用在的目中make在取akefile会配处通展出的命中,处shell在执行时完的。的文中使用通配符。通数“wildcard。如果规一件名包统字(”等字),在这样件时需要对件名统配字符用反进行转义理例“foo\*bar在中它表示了文件“foo*bar。中对一些特字符的转移和B-SHELL以及语言中的基本上相同。另注在inux)中,以线~”开始的文件名有特殊含义。单独使用或者后跟一个斜线(~/),代了当前用户宿主目录(在s下可以通过命令”)。例”代”当前用宿主目录下bin目。浪线后跟一单词)表由这”所指定用户的主目例如“~john/bin”就是代表户john的宿主目录下bin目。在一些统(像和MS-Windows),户没有各自宿主目,此况下通过设置境变“HOME”。4.4.1统配符使用举例节始经到通符被在的令,是令执时由shell行理例Makefile的清空过程文件规则:看子。“make,执行的结果是打印当前作目录下所有的在上一次打印以后被修改过.c”文件。-p$两:上的规则中标“print”时一个空目标文件。(当前目录下存在一个文件“print”,但我们不关心它实际内,此文的作用是记录后一次行此规则的时间。自环变量$”这里表依赖文件列表中被变过的有文件。变量定使用通配不会统配理(此变量定中不使用通配,否则在某情况会出现预期结果一小将会详论)Makefile有这样一个变量“objects=”表“objects”的值是字符串“*.o”(并不是期望格的.o文件列表)。当需要变量“objects”代表有.o文件列示,要使用函数“wildcard”(objects$(wildcar)。4.4.2通配符存在的缺陷在上小节到过量定时使通配能在些情下会致意的结。本小节将对此行详细地分析讨论。书Makefile时,可能在这不正使用配符的方法。这看似正确的方产生的结果可产生非期望的果。例如在你的Makefile中,期望能够根据所有.o文生成可执行文件“foo”。实现如下:=:cc$(CFLAGS)$(objects)里“objects值个“*.o在重“foo规”展,目foo”的依”即有.o文件列表。如果在工作目录下已经存在必需的.o文件那么这些文件成目标的依赖文件目标“”将根据规则被重建。但是如果将工作目录下所有的文件删除,重新执行将会得到一个类似于“没有创建*.o件的规则”的错误提示。这当然不是我们期望的结果(可在出现这个误时会令你感到万分迷惑!。为了达到我们的初衷,在变量进行定义的需要使用一些高级的技巧,包括使用“wildcard”函(变量定义为“objects=$(wildcard)和实现字符的置换。如何现字符串的置,后将进行细地讨论。4.4.3数到过在规中,通配会被展。但在变的定和函用时,通配符将这种情况下如果需要通配符有,就需使用函数“wildcard”的法是:$(wildcardPATTERN...)。在中,它展开为已经存在的使用空分开的、匹配此式的所有件列。如果不在任符合此模的文,函数会略模式字并返回空需要注意是:种情况下则中配符的展和上小节匹配配符的区。一般我们可以使用“$(wildcard*.c)”获取工作目下的所有的文件列表复杂一些法;以使“$(patsubst%.c,%.o,$(wildcard*.c))”,先使“wildcard”获工作件列;之后将列表所有文件名的后.c.o。这样我就可以得到在当前目可生成.o文件列表。因此一个目录下可以使用如下内容的Makefile来下的所文进并最后为一个可执文件::=:cc$(objects)里了make的隐来译.c的源赋到个(:=)。

目录搜索在一个大的工中,般会将源码和二进制.o和可执文件)安在不同的目来进行区分理。这种情况,我们可以使make提供目录索依文件功能(指定若干个录自动索依件)在Makefile中,用依文件目录搜索功。当程的录构发生,就可以不Makefile的依赖目。用。4.5.1一般量VPATH)GNU”通”可以指定依赖文的搜索路当规则依赖文当前目不存,make会在此量所指定的目录下去寻找些依赖文件我们都是此量来定规则依赖文件的搜索路”变量所指定是akefile中所有文件的搜索路径包括了规则依赖文件和目标文件。定”空()将多需要搜索的目录分开。搜索录的顺序是按照变量”定义中的目录顺序进行的(当前目录远是第一搜目录)。例如对变量的定如下:=src:../headers这样我就所规的赖定两搜目,“src”“”对于规则”如果“”在于src”录下此规则等价于“foo:src:/”。通过“”变量指的径Makefile对所有文件有效。当需要为不类型的文件指定不的搜目录时,需使用外一种式。下小节我们将会讨论这种更级的方式。择性搜(关键字v)另设路方用make的”关键字全小写的)。它不是一个变量而是一make的键字,它所实现功和一小节提到的”量类似,是它更为活。可以为不类型文件(由件名分)指定同的搜索录。它的用方法有种:1、”的文件指定搜索目录”。多用空(:)开。类似上的“VPATH。2、清“PATTERN”设路。3、vpath清已路。中式字”“%”匹个或多符,例,“%.h”表示所有以“.h”结文件如果在“”包模式字“%”,那它就是一明的件名,这样就给了此文件的所目录,我很少使用这种方式来为单独的一个文件指定搜索路径。在“vpath”指定的模式中我们可以使用反斜杠来对字符%”行用(和其他的特使字符的引用一样)。“PATTERN”有相特一类文件,而”指定了此类文件录。当则的依赖文列中的文不能前目录下到时,make程序依次“DIRECTORIES”所描述的下寻找此件。例:../headers其含义是Makefile中出现的.h文件果不能在当前目录下找到到目“../headers”里指定的路径仅限于在Makefile文件内容中的.h文件。并不能指定文件所在的路.c源文件中所径需要使gcc”gcc的文档)。在Makefile果存连多个path语”就这些语一个一个行处理搜索某种模式件的目录将所有的通path指符合多,其搜的顺序vpath语在Makefile出现的先后次序来决定。多PATTERN”vpath语之间独立边两种方所有的.c文件的查找目录的顺序(不包含工作目,对工作目录的搜索永远于最优先地位)比较:%表的.c文件,make依次“foo”、blish”、“bar而::%对的.c件make将“foo”、“bar”、“blish”4.5.3目录搜索的机制规则一个赖文可以过目搜寻(使前边到的般搜或者选择性搜索任一种),可能得到是文件的完整路径名(文件的相对路径或者绝对路径,如:/home/Stallman/),它却并是规中列的文件名(规“foo:”,在执搜索后可能得到的依赖文件为目“../src是使“VPATH“vpath指定;因此用目录搜所到的完整的文件路径名可能需要废(可能废弃的是规则目件的全名,规则依赖文件全名不能废弃否则无执行则。为了保证在规则命令行中使用正确的依赖文件,规则的命令行中必须使用自动化变量代表赖文件。于这一点,在下小专门在析Makefile件执行规时对文路径保废弃所据的算下:首如果标在Makefile文所的工下不存,那么目。如果目录搜寻成功,在定的目下存在则的标。那索到完整路径名就为临目标文件被。对于规则中的所有依赖文件相同的方处理。成的处make程序就可以决定规则的目标是否需要重建,两种情况时后续处理如下:a)则目标不需重建:那么通过目录索得到所有完的依赖件路径名有,同,标同是说当规目标不需所有标所会b)make功执行已GPATH变量GPATH”变量和“”变量具相同格式make行出“GPATH”变量义列表废弃为更清楚地promprom”“src”“和“”两源“prom”部==:$(ARFLAGS)首,如果在两个目录(“prom”和“”都存目“”,执行make时会在当前目录下创建目标文“”。另外如果“src”目下经存在“”,以下两种不同的执行结果:1)它的依赖“”“”被更情况我们行make,先make程序索”已经在的“”于目“”赖文有发生变所以重建标。目标的目会发变化。当我们改了“”者“后执“”“”将会在当前目录下创建(标完整路径名被废弃),而不是在“src”目录下更新这些已经存在的文件。此在两个目录下(”)同存在文“”。但只“prom/”新的库件。当上边Makefile文件中使用“指定目时,情就不一了。首看怎么使用“GPATH”,改变后的内容下:===LDFLAGS-L–ltest…….…同样当两目录都不在目文件“”时将会在当前录(”目)下创建如果“src目下已经在目标件“”当其依文件任一个被变以后执行make,目“将会被“src”目录下被更(目标整路径不会被废)。4.5.4命行和索目录make在执行时过录搜索得的的依赖可能会其它录(时依文件为件的完整径名),是已存在的规命令不能发生变化。因此,书写令时我们必保证依赖文件其它录下被发现时规则的命令能够正确执。解决这问题的式是规则的令行中使“自化变量”诸如$^”等。命“$^代表所有搜的录一般文件)列表。”代表规则的目标。所以对于一个规则我们可以进行如下的描述::$(CFLAGS)变量“”译.c文件时gcc的译选,可在Makefile给指明的值、也可使隐的义。规则的赖件列中可包含文件而命令行需要使这些文件这些头文件的作只有在make程序决定目标是需要重建才有义)。我可以用另外一个变来书代替“$^”,如下:=src:../headers:-c$(CFLAGS)$<-o化变“$<代表规则中通过目录搜索得到的依赖文件表的第一个依赖文件。关于自动化变量我们在后续有门的讨论。含规则和搜索目录通变”、或者关键字“”定搜目,对于隐含规同有。例如:个目文件”在Makefile中没有重它的确规,会已经存的“来重它。“”前目下不在时make进行目录索。果能够在个可搜索的目中找此文件,样m会用隐规则根据索到文件完整的路名去建目标,译这个.c源件。隐含规中的令行就是用动化来解决录搜可能来的题;应的命令中文件都是用目搜索的完的路名。可参上一节)文件搜索录中库库也可特要我们在规则的依赖时指一个类似“-lNAME”的依赖文件名(一个奇怪的依一般该普也该而所写的”,悉ld的话我想这就不难理解,和ld的用方完一样写Makefile这书写方。以不应该到奇怪)。下这的是什么。当-lNAME”的make将根据“NAME搜索前的共享库,如果当前能个享库,则搜索它的静态库(当以在令行中使接指定序动态是静接,我们不讨论来看一下详细过程1.make在执行规则会在当前目录下搜索一个名字“”的文件;如果前工作目下不存这样个文,make会继续搜索使VPATH”或者“”定的索目。3.还不存,make搜索系库文件存的默目录,顺序是“/usr/lib“PREFIX/lib在Linux系统“/usr/local/lib,其他的统可能同)。如“”以途径最还是找到话,那make将会按照顺查名“的文。假你系中存在”(不存在”)这个库文件例子:-lcursescc-o$@/usr/lib/执规则时/usr/lib/”完成标文件重。需注意是如果“/usr/lib/”需要执时生成,那么就不能这样写,因为“-lNAME”只诉了器生标需要库上”并没make程序其依赖的库文件应该如何重建当所的索目中不在库“”。将提示“没有规则可以创建目标“”需的目标“-lcurses”。如果在执行make时,现样提示信息,你应该明确生什错,而要为误不知措。依列中出”格式的依时,表示需要索的依文件名“”“.LIBPATTERNS”是多个包含模字符(%)字一个包空格字符),个字使空格。在规则中出现NAME”替变量“”第一个字的模式字符%)而得到第一个库文件名,根据这个库文名在搜索目录下查找,如果能找到、就用这文件,否使用”替第二个字的式字符,进行样的“.LIBPATTERNS””。默认下存在“-lNAME”格链接使用的原变“.LIBPATTERNS”就是执行对出现“-LNAME如。当以将,取-lNAME”。

本Makefile的一不执行ake时有时也以将一伪目标称标签。用伪目有两原因:避免在我们的中定的只执行命令的目标(此目标的目的为了执行行一列命令,而不需要建这个目标)和工作目录下实际文件出现名字冲突提高执行ake时的效率特别是于一个大型的程说,编的率也许同关心。以就两个问我们进行讨:1.如果我们需要这一个规:则定义的令不是创建目标文件,而过make命令指定它来执一些特定的令的clean目标:rm规则“rm”是创建文件“clean”的命令,而是目下所.o文件和文件作目录下不存这个文时们clean*.otemp”执行。这是我们的但是如果在当前工作目录下存在文“clean况就不一样了同样们“makeclean”,由于这个规则没有任何依赖文件,所以目标被认为是最新的而不去执行规则所定义,因将不会被行。这并不我们的初衷。为解决这个问题我们需要将目标“”声明为伪目标。将一个标声明为伪目标的方法是将它作为特殊目标.PHONY”依。如下:.PHONY:这标clean”被声明为一个标,无论在当目录下是否在”文。输入clean”之后”都会执行,一个标被声为伪标执此规会去去查规则建它也提m的执行率,同时不用心由于标和件名重名而使我们的期望失败。在书写伪目标规则时,首先需要声明目标是一个伪目标,之后才伪目标的规则定义。目标“clean的完整书写格式应该如下:rm伪目标的另在make的并行和一存一量,有需make子目录。对多个目录进行ake的现方可以是:在一则的令行用hell循完成:=in$(SUBDIRS);do\$(MAKE)\实现以下1.当子目录执行make出现错误时make不会退。就是说在对一个录执make失败后,会继对其的目进行终执失败的情况下,我们很难根据误提示定位出具体是在那个目录下执。这样给题定位造了很的困难。了解这个问题可以命令行部加入错误测,在命执行误后动退。不的是果在行make”选,此方式失效。2.另一个问题是使这种shell的循环方式时,没有用到并处理由命令条的shell命令能被并行处。有伪标们可它上式所两。=$(SUBDIRS)$(MAKE)-C上边的实现中有一个没有命行的规则“foo:baz”,此规用来制子录的make顺序。它的用限同目“foo”和“”的过程(在理“foo”目录之前,要等待”录处理成)。醒大家在书写个并行执行m的Makefile时,目录的处理顺序是需要特别注意的。一般情下,个伪标不为另个目的依。这因为一个标文的依赖包含目标时,一次执行这个则时目标所定的命都会被执(因它作为规则的赖,重建则目时需要首重建则的所有赖文)。当一伪目没有作为任何目标此目标是一个被创建或者已在的文件)的赖时,我们只通过make命令行明确定它为的终极标,在规的命clean”在M中多个伪标)。在个目下如果需创建个可执行序,们可以将有程的重建规中述。为Makefile中第一个目标是“终极目标”,约定的做法是使“all”的伪目标下:.PHONY::cc:cc-o:cc-o行make时“all”被作为。,make或者重建(存在)标“all”的所有依赖文件(prog1、prog2prog3)。当需要单独更新一程时我可以过make的命令行项明确定要建程(如:“makeprog1”)。当作一个依make将其作为另外一个的例程处理(可以这理解:作为另一个伪标的必执行的分,就行语言中的函数用一样)。下边例子就这种用::rmprogramcleanobj:rm:*.diff“cleanobj“cleandiff这两个目标有点“子程序的意(执行目“clearall时会触发它们所定义的命令被行们可以输cleanall“makecleanobj”和“makecleandiff”命令来达到清不同种文件的的。例首先通特殊目标“.PHONY”明了多伪目标它们之使用空分割,之后才是各伪目标规则定。说明:rm”使用选“–f”(--force来防止在缺少删除文件时出错并退出使make”败也以“rm之前加上“-”防“rm”错误退出这方式时make会提示误信但会出为不看这讨厌信息需用上述的第方式。另外make

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论