




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MakeFile详解,Makefile是什么,GNUmake是一个命令工具,是一个用来控制软件构建过程的自动化管理工具。Make工具通过称为Makefile的文件来完成并自动维护编译工作,由RichardStallman与RolandMcGrath设计开发。Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中记录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。make命令格式:make-fMakefileoptiontarget#maketarget#make#makeclean(伪目标),Makefile是什么,Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。,实例:Hello程序的MakeFile,TOPDIR=./include$(TOPDIR)Rules.makEXTRA_LIBS+=EXEC=$(INSTALL_DIR)/helloOBJS=hello.oall:$(EXEC)$(EXEC):$(OBJS)$(CC)$(LDFLAGS)-o$(OBJS)$(EXTRA_LIBS)install:$(EXP_INSTALL)$(EXEC)$(INSTALL_DIR)clean:-rm-f$(EXEC)*.elf*.gdb*.o,实例:Hello程序的MakeFile,CC指明编译器的宏EXEC表示生成的执行文件名称的宏OBJS目标文件列表宏LDFLAGS连接参数宏All:编译主入口Clean:清除编译结果Install:将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录,Makefile的文件名,默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。当然,你可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“-file”参数,如:make-fMake.Linux或make-fileMake.AIX。,Makefile里有什么?,Makefile里主要包含了五个东西:显式规则、隐含规则、变量定义、文件指示和注释。1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。2、隐含规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。,Makefile里有什么?,3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。,Makefile里有什么?,5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C+,Java中的“/”一样。在Makefile中的命令,必须要以Tab键开始。,设置makefile中文件的搜索路径,在makefile中,可以通过给VPATH赋值来设置规则中目标文件和依赖文件的搜索目录。Make首先搜索当前目录,如果未找到依赖的文件,make将按照VPATH中给的目录依次搜索VPATH对makefile中所有文件都有效。如:VPATH:=/c/ming/c/ming/head也可以使用指令vpath,与VPATH在使用上的区别是:vpath可以给不同类文件指定不同的搜索目录。如:vpath%.c/c/mingvpath%.h/c/ming/headvpath%.c表示清除所有vpath对%.c设置的搜索目录,定义变量和引用变量,变量的定义和应用与Linux环境变量一样,变量名要大写,变量一旦定义后,就可以通过将变量名用圆括号括起来,并在前面加上“$”符号来进行引用。变量的主要作用:1、保存文件名列表2、保存可执行命令名,如编译器3、保存编译器的参数变量一般都在makefile的头部定义。按照惯例,所有的makefile变量都应该是大写。,GNUmake的主要预定义变量,$*不包括扩展名的目标文件名称$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件$第一个依赖文件的名称$?所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚$目标的完整名称$所有的依赖文件,以空格分开,不包含重复的依赖文件$%如果目标是归档成员,则该变量表示目标的归档成员名称,引用其它的Makefile,在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是:includefilename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)在include前面可以有一些空字符,但是绝不能是Tab键开始。include和可以用一个或多个空格隔开。,引用其它的Makefile实例,有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:includefoo.make*.mk$(bar)等价于:includefoo.makea.mkb.mkc.mke.mkf.mk,环境变量MAKEFILES,如果你的当前环境中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似于include的动作。这个变量中的值是其它的Makefile,用空格分隔。只是,它和include不同的是,从这个环境变量中引入的Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。Makee环境变量优先于makefile文件中的变量,Makefile的规则,target.:mand.target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。还可以是一个标签(Label)。dependencies就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令,可以有若干行)Command必须以Tab键开头。否则,make就会显示出错信息。如果某一命令行太长可以分作两行,用反斜杠()连接,edit:main.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.ogcc-oeditmain.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.omain.o:main.cdefs.hgcc-cmain.ckbd.o:kbd.cdefs.hcommand.hgcc-ckbd.ccommand.o:command.cdefs.hcommand.hgcc-ccommand.cdisplay.o:display.cdefs.hbuffer.hgcc-cdisplay.cinsert.o:insert.cdefs.hbuffer.hgcc-cinsert.csearch.o:search.cdefs.hbuffer.hgcc-csearch.cfiles.o:files.cdefs.hbuffer.hcommand.hgcc-cfiles.cutils.o:utils.cdefs.hgcc-cutils.cclean:rmeditmain.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.o,OBJECTS=main.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.oedit:$(OBJECTS)gcc-oedit$(OBJECTS)main.o:main.cdefs.hgcc-cmain.ckbd.o:kbd.cdefs.hcommand.hgcc-ckbd.ccommand.o:command.cdefs.hcommand.hgcc-ccommand.cdisplay.o:display.cdefs.hbuffer.hgcc-cdisplay.cinsert.o:insert.cdefs.hbuffer.hgcc-cinsert.csearch.o:search.cdefs.hbuffer.hgcc-csearch.cfiles.o:files.cdefs.hbuffer.hcommand.hgcc-cfiles.cutils.o:utils.cdefs.hgcc-cutils.cclean:rmedit$(OBJECTS),让make自动推导,GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个%.o文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。只要make看到一个%.o文件,它就会自动的把%.c文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且gcc-cwhatever.c也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。,OBJECTS=main.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.oedit:$(OBJECTS)gcc-oedit$(OBJECTS)main.o:defs.hkbd.o:defs.hcommand.hcommand.o:defs.hcommand.hdisplay.o:defs.hbuffer.hinsert.o:defs.hbuffer.hsearch.o:defs.hbuffer.hfiles.o:defs.hbuffer.hcommand.hutils.o:defs.h.PHONY:cleanclean:rmedit$(OBJECTS)“.PHONY”表示,clean是个伪目标文件。,OBJECTS=main.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.oedit:$(OBJECTS)cc-oedit$(OBJECTS)$(OBJECTS):defs.hkbd.ocommand.ofiles.o:command.hdisplay.oinsert.osearch.ofiles.o:buffer.h.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高处安装、维护、拆除高处作业(复审)模拟考试题库试卷及答案
- 药品调剂与管理办法
- 绿化施工及管理办法
- 装饰装修咨询管理办法
- 行政中心前台管理办法
- 业务外协加工管理办法
- 上海旅游安全管理办法
- 中国农药登记管理办法
- it人才队伍管理办法
- 蔬菜分拣厂管理办法
- 中考英语高频单词(背诵版)
- AI技术在电力系统发展中的应用与前景
- 余热锅炉施工方案
- 动态关节松动术课件
- Unit 1 You and Me Section A 1a~2教学设计- 2024-2025学年人教版英语七年级上册
- 统编版中考语文一轮复习:义务教育语文课程常用字表(3500字注音版)(2022版课标)
- 九一八事变主题班会课件模板
- 学校和教练协议书
- 2.1.充分发挥市场在资源配置中的决定性作用 课件高中政治统编版必修二经济与社会
- 早稻栽培管理关键技术
- 2014版SA8000社会责任管理体系管理手册
评论
0/150
提交评论