《MakeFile详解》PPT课件

上传人:xuey****n398 文档编号:245001316 上传时间:2024-10-07 格式:PPT 页数:23 大小:211.99KB
返回 下载 相关 举报
《MakeFile详解》PPT课件_第1页
第1页 / 共23页
《MakeFile详解》PPT课件_第2页
第2页 / 共23页
《MakeFile详解》PPT课件_第3页
第3页 / 共23页
点击查看更多>>
资源描述
*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,MakeFile详解,Makefile 是什么,GNU make是一个命令工具,是一个用来控制软件构建过程的自动化管理工具。Make工具通过称为Makefile的文件来完成并自动维护编译工作,由RichardStallman 与RolandMcGrath设计开发,。,Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中记录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。,make命令格式:make-f Makefile option target,#make target#make#make clean (伪目标),Makefile 是什么,Makefile的,宗旨,就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。,makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。,实例:Hello程序的MakeFile,TOPDIR=./,include$(TOPDIR)Rules.mak,EXTRA_LIBS+=,EXEC=$(INSTALL_DIR)/hello,OBJS=hello.o,all:$(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-f Make.Linux或make-file Make.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/ming,vpath%.h/c/ming/head,vpath%.c 表示清除所有vpath对%.c设置的搜索目录,定义变量和引用变量,变量的定义和应用与Linux环境变量一样,变量名要大写,变量一旦定义后,就可以通过将变量名用圆括号括起来,并在前面加上“$”符号来进行引用。,变量的主要作用:,1、保存文件名列表,2、保存可执行命令名,如编译器,3、保存编译器的参数,变量一般都在makefile的头部定义。按照惯例,所有的makefile变量都应该是大写。,GNU make的主要预定义变量,$*不包括扩展名的目标文件名称,$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件,$第一个依赖文件的名称,$?所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚,$目标的完整名称,$所有的依赖文件,以空格分开,不包含重复的依赖文件,$%如果目标是归档成员,则该变量表示目标的归档成员名称,引用其它的Makefile,在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是:,include,filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符),在include前面可以有一些空字符,但是绝不能是Tab键开始。,include和可以用一个或多个空格隔开。,引用其它的Makefile,实例,有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:,include foo.make*.mk$(bar),等价于:,include foo.make a.mk b.mk c.mk e.mk f.mk,环境变量 MAKEFILES,如果你的当前环境中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似于include的动作。这个变量中的值是其它的Makefile,用空格分隔。只是,它和include不同的是,从这个环境变量中引入的Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。,Make e 环境变量优先于makefile文件中的变量,Makefile的规则,target.:mand.target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。还可以是一个标签(Label)。dependencies就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令,可以有若干行),Command必须以Tab键开头。否则,make就会显示出错信息。如果某一命令行太长可以分作两行,用反斜杠()连接,edit:main.okbd.ocommand.odisplay.o insert.osearch.ofiles.outils.o gcc-oeditmain.okbd.ocommand.odisplay.o insert.osearch.ofiles.outils.o main.o:main.cdefs.h gcc-cmain.c kbd.o:kbd.cdefs.hcommand.h gcc-ckbd.c command.o:command.cdefs.hcommand.h gcc-ccommand.c display.o:display.cdefs.hbuffer.h gcc-cdisplay.c insert.o:insert.cdefs.hbuffer.h gcc-cinsert.c search.o:search.cdefs.hbuffer.h gcc-csearch.c files.o:files.cdefs.hbuffer.hcommand.h gcc-cfiles.c utils.o:utils.cdefs.h gcc-cutils.c clean:rmeditmain.okbd.ocommand.odisplay.o insert.osearch.ofiles.outils.o,OBJECTS=main.okbd.ocommand.odisplay.o insert.osearch.ofiles.outils.o,edit:$(OBJECTS)gcc-oedit$(OBJECTS)main.o:main.cdefs.h gcc-cmain.c kbd.o:kbd.cdefs.hcommand.h gcc-ckbd.c command.o:command.cdefs.hcommand.h gcc-ccommand.c display.o:display.cdefs.hbuffer.h gcc-cdisplay.c insert.o:insert.cdefs.hbuffer.h gcc-cinsert.c search.o:search.cdefs.hbuffer.h gcc-csearch.c files.o:files.cdefs.hbuffer.hcommand.h gcc-cfiles.c utils.o:utils.cdefs.h gcc-cutils.c clean: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.o insert.osearch.ofiles.outils.o edit:$(OBJECTS)gcc-oedit$(OBJECTS)main.o:defs.h kbd.o:defs.hcommand.h command.o:defs.hcommand.h display.o:defs.hbuffer.h insert.o:defs.hbuffer.h search.o:defs.hbuffer.h files.o:defs.hbuffer.hcommand.h utils.o:defs.h.PHONY:clean clean:rmedit$(OBJECTS),“.PHONY”表示,clean是个伪目标文件。,OBJECTS=main.okbd.ocommand.odisplay.o insert.osearch.of
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!