《Make工程管理器 17P.ppt》由会员分享,可在线阅读,更多相关《Make工程管理器 17P.ppt(17页珍藏版)》请在金锄头文库上搜索。
1、Make工程管理器 Make工程管理器 所谓工程管理器 是指管理较多的文件的 可以试想一下 有一个上百个文件的代码构成的项目 如果其中只有一个或少数几个文件进行了修改 按照之前所学的编译工具 就不得不把这所有的文件重新编译一遍 因为编译器并不知道哪些文件是最近更新的 而只知道需要包含这些文件才能把源代码编译成可执行文件 于是 程序员就不得不再重新输入数目如此庞大的文件名以完成最后的编译工作 所以 人们就希望有一个工程管理器能够自动识别更新了的文件代码 同时又不需要重复输入冗长的命令行 这样 Make工程管理器也就应运而生了 Make工程管理器 实际上 Make工程管理器就是 自动编译管理器 这
2、里的 自动 是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量 同时 它通过读入Makefile文件的内容来执行大量的编译工作 用户只需编写一次简单的编译语句就可以了 它大大提高了实际项目的工作效率 Makefile基本结构 Makefile是Make读入的唯一配置文件 在一个Makefile中通常包含如下内容 需要由make工具创建的目标体 target 通常是目标文件或可执行文件 要创建的目标体所依赖的文件 dependency file 创建每个目标体时需要运行的命令 command 它的格式为 target dependency filescommand Makefile基
3、本结构 例如 有两个文件分别为hello c和hello h 创建的目标体为hello 那么 对应的Makefile就可以写为 hello hello oicc ohellohello ohello o hello chello hicc ohello o chello c接着就可以使用make了 使用make的格式为 maketarget这样make就会自动读入Makefile 也可以是首字母小写makefile 并执行对应target的command语句 并会找到相应的依赖文件 如果直接运行make 则建立Makefile中的第一个目标 注意 在Makefile中的每一个command前必
4、须有 Tab 符 否则在运行make命令时会出错 Makefile基本结构 例1 helloword file1 ofile2 oiccfile1 ofile2 o ohellowordfile1 o file1 chead hicc cfile1 c ofile1 ofile2 o file2 chead hicc cfile2 c ofile2 o Makefile变量 为了进一步简化编辑和维护Makefile make允许在Makefile中创建和使用变量 变量是在Makefile中定义的名字 用来代替一个文本字符串 该文本字符串称为该变量的值 在具体要求下 这些值可以代替目标体 依赖文
5、件 命令以及makefile文件中其它部分 在Makefile中的变量定义有两种方式 一种是递归展开方式 另一种是简单方式 Makefile变量 递归展开方式定义的变量是在引用在该变量时进行替换的 即如果该变量包含了对其他变量的应用 则在引用该变量时一次性将内嵌的变量全部展开 虽然这种类型的变量能够很好地完成用户的指令 但是它也有严重的缺点 如不能在变量后追加内容 为了避免上述问题 简单扩展型变量的值在定义处展开 并且只展开一次 因此它不包含任何对其它变量的引用 从而消除变量的嵌套引用 递归展开方式的定义格式为 VAR var简单扩展方式的定义格式为 VAR varMake中的变量使用均使用格
6、式为 VAR Makefile变量 变量名是不包括 结尾空格的任何字符串 同时 变量名中包含字母 数字以及下划线以外的情况应尽量避免 因为它们可能在将来被赋予特别的含义 变量名是大小写敏感的 例如变量名 foo FOO 和 Foo 代表不同的变量 Makefile变量 Makefile中的变量分为用户自定义变量 预定义变量 自动变量及环境变量 自定义变量的值由用户自行设定 而预定义变量和自动变量是通常在Makefile都会出现的变量 其中部分有默认值 也就是常见的设定值 当然用户可以对其进行修改 Makefile中常见预定义变量 AR库文件维护程序的名称 默认值为arAS汇编程序的名称 默认值
7、为asCCC编译器的名称 默认值为ccCPPC预编译器的名称 默认值为 CC ECXXC 编译器的名称 默认值为g FCFORTRAN编译器的名称 默认值为f77RM文件删除程序的名称 默认值为rm fARFLAGS库文件维护程序的选项 无默认值ASFLAGS汇编程序的选项 无默认值CFLAGSC编译器的选项 无默认值CPPFLAGSC预编译的选项 无默认值CXXFLAGSC 编译器的选项 无默认值FFLAGSFORTRAN编译器的选项 无默认值 Makefile中常见自动变量 不包含扩展名的目标文件名称 所有的依赖文件 以空格分开 并以出现的先后为序 可能包含重复的依赖文件 第一个依赖文件的
8、名称 所有时间戳比目标文件晚的依赖文件 并以空格分开 目标文件的完整名称 所有不重复的依赖文件 以空格分开 如果目标是归档成员 则该变量表示目标的归档成员名称 Makefile规则 Makefile的规则是Make进行处理的依据 它包括了目标体 依赖文件及其之间的命令语句 一般的 Makefile中的一条语句就是一个规则 为了简化Makefile的编写 make还定义了隐式规则和模式规则 Makefile规则 1 隐式规则隐式规则能够告诉make怎样使用传统的技术完成任务 这样 当用户使用它们时就不必详细指定编译的具体细节 而只需把目标文件列出即可 Make会自动搜索隐式规则目录来确定如何生成
9、目标文件 注意 在隐式规则只能查找到相同文件名的不同后缀名文件 如 file o 文件必须由 file c 文件生成 Makefile规则 2 模式规则模式规则是用来定义相同处理规则的多个文件的 它不同于隐式规则 隐式规则仅仅能够用make默认的变量来进行操作 而模式规则还能引入用户自定义变量 为多个文件建立相同的规则 从而简化Makefile的编写 模式规则的格式类似于普通规则 这个规则中的相关文件前必须用 标明 使用变量替换 OBJS file1 ofile2 oCC icchelloworld OBJS CC OBJS ohelloworldfile1 o file1 chead h C
10、C ofile1 o cfile1 cfile2 o file2 chead h CC ofile2 o cfile2 cclean rm rf ohelloworld 例1 helloword file1 ofile2 oiccfile1 ofile2 o ohellowordfile1 o file1 chead hicc cfile1 c ofile1 ofile2 o file2 chead hicc cfile2 c ofile2 oclean rm rf ohelloworld 习题 拷贝user01目录下的makefile文件夹到当前用户目录下 即例1 修改makefile文件 要求使用自动变量代替编译语句中出现的目标文件和依赖文件用make验证所编写的makefile是否正确