MakeFile详解

上传人:猪** 文档编号:242963202 上传时间:2024-09-12 格式:PPT 页数:23 大小:81KB
返回 下载 相关 举报
MakeFile详解_第1页
第1页 / 共23页
MakeFile详解_第2页
第2页 / 共23页
MakeFile详解_第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.:dependencies. command .target,也就是一个目标文件,可以是,ObjectFile,,也可以是执行文件。还可以是一个标签(,Label)。 dependencies,就是,要生成那个,target,所需要的文件或是目标。,command,也就是,make,需要执行的命令。(任意的,Shell,命令,可以有若干行),Command,必须以,Tab,键开头。否则,,make,就会显示出错信息。如果某一命令行太长可以分作两行,用反斜杠,(),连接,edit:main.o,kbd,.ocommand.odisplay.o insert.osearch.ofiles.o,utils,.o,gcc,-oeditmain.o,kbd,.ocommand.odisplay.o insert.osearch.ofiles.o,utils,.o main.o:main.c,defs,.h,gcc,-cmain.c,kbd,.o:,kbd,.c,defs,.hcommand.h,gcc,-c,kbd,.c command.o:command.c,defs,.hcommand.h,gcc,-ccommand.c display.o:display.c,defs,.hbuffer.h,gcc,-cdisplay.c insert.o:insert.c,defs,.hbuffer.h,gcc,-cinsert.c search.o:search.c,defs,.hbuffer.h,gcc,-csearch.c files.o:files.c,defs,.hbuffer.hcommand.h,gcc,-cfiles.c,utils,.o:,utils,.c,defs,.h,gcc,-c,utils,.c clean:,rm,editmain.o,kbd,.ocommand.odisplay.o insert.osearch.ofiles.o,utils,.o,OBJECTS=main.o,kbd,.ocommand.odisplay.o insert.osearch.ofiles.o,utils,.o,edit:$(OBJECTS),gcc,-oedit$(OBJECTS) main.o:main.c,defs,.h,gcc,-cmain.c,kbd,.o:,kbd,.c,defs,.hcommand.h,gcc,-c,kbd,.c command.o:command.c,defs,.hcommand.h,gcc,-ccommand.c display.o:display.c,defs,.hbuffer.h,gcc,-cdisplay.c insert.o:insert.c,defs,.hbuffer.h,gcc,-cinsert.c search.o:search.c,defs,.hbuffer.h,gcc,-csearch.c files.o:files.c,defs,.hbuffer.hcommand.h,gcc,-cfiles.c,utils,.o:,utils,.c,defs,.h,gcc,-c,utils,.c clean:,rm,edit$(OBJECTS),让,make,自动推导,GNU,的,make,很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个,%.,o,文件后都写上类似的命令,因为,我们的,make,会自动识别,并自己推导命令。,只要,make,看到一个,%.,o,文件,它就会自动的把,%.,c,文件加在依赖关系中,如果,make,找到一个,whatever.o,,那么,whatever.c,,就会是,whatever.o,的依赖文件。并且,gcc,-cwhatever.c,也会被推导出来,于是,我们的,makefile,再也不用写得这么复杂。我们的是新的,makefile,又出炉了。,OBJECTS =main.o,kbd,.ocommand.odisplay.o insert.osearch.ofiles.o,utils,.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:,rm,edit$(OBJECTS),“.PHONY”,表示,,clean,是个伪目标文件。,OBJECTS =main.o,kbd,.ocommand.odisplay.o insert.osearch.ofiles.o,utils,.o edit:$(OBJECTS ) cc-oedit$(OBJECTS ) $(OBJECTS ):,defs,.h,kbd,.ocommand.ofiles.o:command.h display.oinsert.osearch.ofiles.o:buffer.h .PHONY:clean clean:,rm,edit$(OBJECTS ),Makefile,还能干什么,书写命令,echo,正在编译,XXX,模块,.,执行命令,label,的使用,使用条件判断,例:,ifeq,($(CC),gcc,) $(CC)-o,foo,$(objects)$(,libs,_for_,gcc,) else $(CC)-o,foo,$(objects)$(normal_,libs,),endif,使用函数,更新函数库文件,可参考资料,http:/www.gnu.org/software/make/manual/make.html,陈皓,跟我一起写,Makefile,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


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

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


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