make工程管理器及其Makefile及其使用.doc_第1页
make工程管理器及其Makefile及其使用.doc_第2页
make工程管理器及其Makefile及其使用.doc_第3页
make工程管理器及其Makefile及其使用.doc_第4页
make工程管理器及其Makefile及其使用.doc_第5页
全文预览已结束

下载本文档

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

文档简介

make工具及其使用make工程管理器是一种能够自动识别更新了文件代码的工具,同时又不需要重复输入冗长的命令行,当文件较多是比较实用Autoconf和Automake等是这样的工具可以自动生成Makefile文件1:Make命令和Makefile要使用make,必须编写一个叫Makefile的文件,它描述了软件包中各个文件之间的关系,提供了更新每个文件的命令Make程序利用Makefile的数据和每个文件最近一次更改的时间来确定哪个文件需要更新,对每个更新文件,make程序使用Makefile中定义的命令来更新它,Makefile在文件说明如何编译个源文件并链接生成可执行文件,并要求源文件之间的依赖关系Makefile文件的格式: 目标:依赖项列表 命令其中,通常目标是要产生的文件的名称,目标可以是可执行文件或OBJ文件,也可以是一个执行的动作名称,比如clean。命令所在的行首要有空格,空格数为一个制表位(Tab),Makefile文件也可以在描述语句行前加“#”表示注释,make程序将跳过此行不执行,相关命令如果过长,还可以使用反斜杠“”作为后接行符来续行。Make程序执行Makefile的相关行的默认情况是将执行状态显示出来,如果在相关行前加“”,就可以避免显示该行Makefile的最大特点是“自动化编译”,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发效率,如果想要删除执行文件和所有的中间目标文件,那么只需要简单地执行一下“make clean”即可,这里要说明的一点是,clean不是一个文件,它只不过是一个动作名词,也可称为标签,其后的冒号什么都没有。这样make就不会自动去查找文件之间的依赖性,因此也就不会自动执行其后所定义的命令make的命令格式:#make 选项 宏 目标 宏是执行make时使用的宏值其中选项有:-f 指定Makefile文件名-p 打印出Makefile中变量数据库和隐含规则-i 忽略linux命令返回的错误,继续执行下面的命令,如果没有该选项,则遇到linux命令出错就会停止-s 表示执行不显示执行命令-r 忽略内部规则-n 按实际运行时的执行顺序显示命令,包括以“”开头的命令,但并不真正执行,这个选项常用来检查Makefile文件的正确性-d Debug模式,输出有关文件和检测时间的详细信息-t 修改每个目标文件的更新日期,但不重写创建这些文件-c dir 在读取Makefile之前改变到指定的目录dir-I dir 指定使用的Makefile所在的目录-w 在处理Makefile之前和之后,都显示工作目录 如果只输入 #make 即没有指定其他任何参数,make将对Makefile中的第一行目标进行维护,在发现目标依赖于其他文件时,又继续在Makefile文件中寻找以新的依赖文件为目标的相关的文件,并这样层层进行搜索 make程序也可以指定要指定要进行维护的目标,如:#make test.o 就只把test.o当作目标,而只考虑它所依赖的文件的更新如果想使用自己指定的Makefile文件,可以使用如下命令:#make f filename 这样,make就在当前目录下寻找文件名为filename的Makefile文件并读入相关行 尽量将自己的源程序中的源程序集中在一个目录中,并且把makefile和源程序放在一起,这样用起来比较方便,如果make程序中没有使用-f选项指定一个Makefile,make将在当前目录下按顺序寻找下列文件:GNUMakefile、Makefile和makefile,推荐使用Makefile,因为它的第一个字母大写,通常被列在一个目录文件列表的最前面。Makefile文件都可以使用vi或emacs这样的文本编辑器来编辑。在makefile文件中除了依赖关系的描述外,还可以有宏,宏代表文件名和命令任选项的短名 在程序目录中创建一个名为makefile的文本文件,将当前工作目录切换到makefile所在的目录,目前这个makefile支持在当前目录中的调用,不支持当前目录和makefile所在不是同一目录的名字2:Makefile的规则最基本的编写规则的方法是从最终的源程序文件开始一个一个地查看源文件,把它们要生成的目标文件作为目标,而C源文件和源文件包含的头文件作为依赖文件生成规则,但是我们必须去分析源码文件的嵌套关系,实际上我们可以让gcc做这个工作,当使用gcc的时候,可以用-MM(输出一个Make兼容的相关列表)参数,它可以为每一个输入的C语言源文件输出一个依赖规则,把gcc生成的目标文件作为Makefile规则的目标文件,而把生成这个目标文件的C语言源文件和所有应该被引用的头文件作为依赖,gcc只输出规则的依赖关系,不含有命令部分,用户需要写入需要的命令或什么都不写,make会使用隐含规则Makefile变量:为了进一步简化编辑和维护makefile,make允许在makefile中创建和使用变量,变量时在makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。在具体要求下,这些值可以代替目标体、依赖文件,命令已经makefile其他部分在makefile中的变量定义有两种:一种是递归展开方式,另一种是简单方式递归展开方式定义的变量在该变量替换时进行替换,如果该变量包含了对其他变量的引用,则在引用该变量时一次性将嵌套的变量全部展开递归展开方式的定义格式为:VAR=var。简单展开方式的定义为:VAR:=varMake中的变量使用均使用格式为$(VAR)注意:变量名是不包括:、#、=、结尾空格的任何字符串,变量名大小写敏感,推荐makefile内部使用小写字母作为变量名例如:先看看edit这个规则:edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o gcc o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.omain.o : main.c defs.hgcc c mian.c o main.o.clearn: rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o如采用递归展开方式来定义如下:OBJS= main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit:$(OBJS) gcc o edit $(OBJS)main.o : main.c defs.hgcc c mian.c o main.o.Clearn: Rm edit $(OBJS)可以看到,如果又有新的“.o”文件需要加入,用户只需简单地修改一下“OBJS”变量即可。Makefile中的变量分为用户自定义变量、预定义变量、自动变量及环境变量,预定义变量和自动变量为通常在makefile都会出现的变量,其中部分有默认值,当然用户可以对其修改具体如下:命令格式 含义AR 库文件维护程序的名称,默认值为arAS 汇编程序的名称,默认值为asCC C编译器的名称,默认为ccCPP C预编译器的名称,默认值为$(CC)-ECXX C+编译器的名称,默认值为g+FC FORTRAN编译器的名称,默认值为f77RM 文件删除程序的名称,默认值为rm -fARFLAGS 库文件维护程序选项,无默认值ASFLAGS 汇编程序的选项,无默认值CFLAGS C编译器的选项,无默认值CPPFLAGS C预编译的选项,无默认值CXXFLAGS C+编译器的选项,无默认值FFLAGS FORTRAN编译器的选项,无默认值用户需要明确列出来即CC=gcc,一般CFLAGS= -wall O -g自动变量通常可以代表边缘语句中出现的目标和依赖文件等,并具有本地含义即下一语句出现的相同变量代表的是下一语句的目标问和依赖文件常见的自动变量:命令格式 含义$* 不包含扩展名的目标文件名称$+ 所有的依赖文件,以空格分开,并以出现的先后为,可能包含重复的依赖文件$ 第一个依赖文件$? 所有时间戳比目标文件晚的依赖文件,并以空格分开$ 目标文件的完整名$ 所有不重复的依赖文件,以空格分开$% 如果目标是归档成员,则该变量表示目标的归档成员名称Makefile中还可以使用环境变量,使用环境变量的方法相对比较简单Makefile中还有一些规则称为隐晦规则,运行make工具对目标文件寻找传统的更新方法,而避免指定任何命令。可以编写没有命令行的规则或根本不编写规则,这样make工具将根据存在的源文件类型或要生成的文件类型决定使用何种隐含规则Makefile中常见的隐含规则: 后缀名 规则C编译:.c变为.o $(CC) c $(CPPFLAGS) $(CFLAGS) C+编译:.cc或.C变为.o $(CXX) c $( CPPFLAGS) $(CXXFLAGS)汇编:.o变为.S $(CPP) $(CPPFLAGS)链接:.o变为progam $(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS)其中:ASFLAGS 用于汇编编译器的额外标识CFLAGS 用于C编译器的额外标识CXXFLAGS 用于C+编译器的额外标识CPPFLAGS 用于C预处理以及使用它的程序的额外标识LDFLAGS 用于调用linker(ld)的编译器的额外标识例如:OBJS= main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit:$(OBJS) gcc o e

温馨提示

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

评论

0/150

提交评论