makefile讲解

上传人:第*** 文档编号:49188408 上传时间:2018-07-25 格式:PPT 页数:33 大小:116.50KB
返回 下载 相关 举报
makefile讲解_第1页
第1页 / 共33页
makefile讲解_第2页
第2页 / 共33页
makefile讲解_第3页
第3页 / 共33页
makefile讲解_第4页
第4页 / 共33页
makefile讲解_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《makefile讲解》由会员分享,可在线阅读,更多相关《makefile讲解(33页珍藏版)》请在金锄头文库上搜索。

1、Makefile讲解 Makefile概述 Makefile编写 Makefile运行 Makefile应用实例课前培训 什么是Unix shell脚本 什么是Makefile 什么是程序的编译链接Makefile概述 Makefile的规则 Makefile的内容 Makefile的文件名 Makefile的工作原理 Makefile的工作方式 Makefile的简单实例Makefile的规则 target . : prerequisites . commandtarget 目标文件prerequisites 源文件command源文件生成目标文件的规则,shell命令Makefile内容

2、Makefile里主要包含了五项内容显式规则隐晦规则变量引用文件注释Makefile的文件名 默认的三种文件名GNUMakefile、Makefile、makefile 执行时直接使用make命令make make -f Makefile 自定义文件名可使用自定义文件名,makelib执行时使用make的“-f”和“-file”参数 make f makelibmake的工作方式1、读入Makefile。 2、读入引用Makefile等文件。 3、初始化文件中的变量。 4、推导隐晦规则,并分析所有规则。 5、为所有的目标文件创建依赖关系链。 6、根据依赖关系,决定哪些目标要重新生成。 7、执行

3、生成命令。 Makefile的默认工作原理 找到第一个目标文件,并把该文件作为最终文件 根据依赖关系进行工作如果目标文件的依赖文件不存在或者更新,会重新编译目标文 件如果没有依赖文件,make不会自动执行command命令 在过程中出现错误,make会直接退出并报错简单的Makefile实例 objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit : $(objects) cc -o edit $(objects)main.o : defs.h kbd.o : defs.h command

4、.h command.o : defs.h command.h display.o : defs.h buffer.h insert.o : defs.h buffer.h search.o : defs.h buffer.h files.o : defs.h buffer.h command.h utils.o : defs.hMakefile的编写 Makefile的书写规则 Makefile的引用文件 Makefile的引用变量 Makefile的条件语法 Makefile的引用函数 Makefile的字符含义Makefile的书写规则 规则语法target . : prerequisi

5、tes .commandtargets : prerequisites ; commandcommandtargets 文件名,以空格分开prerequisites目标所依赖的文件,以空格分开多个文件command 命令行, Tab键开头,用分号做为分隔Makefile的引用文件 include filename文件名称路径 特点符合shell的任意文件模式多个文件以空格分开include不能以Tab键开始 ,可以存在空格Makefile的引用变量变量命名语法包含字符、数字,下划线(可以是数字开头)不能使用“:”、“#”、“=”或是空字符(空格、回车等) 大小写敏感 定义变量在声明时需要赋初值

6、 使用在变量名前加上“$”符号,建议使用小括号“()”或是大括号“” 变量引用变量 $(var:a=b)”或是“$var:a=b 操作符“=”和”:=”的区别 操作符 “?=”Makefile的条件语法条件表达式的语法为:endif以及:elseendif其中表示条件关键字 ,这个关键字有四个ifeq ,ifneq ,ifdef,ifndef 允许多余的空格, else,endif, 不能以Tab键做为开始 Makefile的条件语法 ifeq (, ) 比较两个参数的值是否相同,相同为真 ifneq (, ) 比较两个参数的值是否相同,不同为真 ifdef 变量的值非空,则表达式为真 Ifn

7、def变量的值为空,则表达式为真Makefile的引用函数 调用语法$( ) $ 函数名函数的参数 语法要求参数间以逗号“,”分隔 函数名和参数之间以“空格”分隔 函数调用以“$”开头,以圆括号或花括号把函数名和参数括起 Makefile的引用函数 调用举例$(subst , ) 名称:字符串替换函数subst。 功能: -被替换前的字符串- 被替换后的字符串-被替换的字串$(subst ee,EE,feet on the street)原为feet on the street调用函数后为fEEt on the streetMakefile的字符含义命令间的“;”上条命令结果应用到下条命令 命

8、令行前的字符“”不显示执行命令 命令行前的字符“-”忽略执行该命令的错误 命令行前的字符“#”用于注释,Makefile中只有行注释 命令中的波浪号“”“/test”,这就表示当前用户的$HOME目录下的test目录 “hchen/test”则表示用户hchen的宿主目录下的test目录 命令中的波浪号“ ”换行符 文件中的通配符“*”,“?”和“.” Makefile 的运行 特点命令同操作系统Shell的命令行 命令的开头以Tab键开头,或者紧跟在依赖规则后面 的分号后按UNIX的标准Shell解释执行“/bin/sh”make按顺序执行命令Makefile 的运行 make命令执行结束的

9、退出码0 表示成功执行。 1 如果make运行时出现任何错误,其返回1。 2 使用make的“-q”选项,返回0则说明要更新,返 回是2说明有错误发生。 Makefile 的运行 默认执行文件GNUMakefile、Makefile、Makefile 指定执行文件 make f hchen.mk 默认目标Makefile中的第一个(组)目标 指定目标make fxl00101Makefile 的运行Makefile的运行参数-f -指定需要执行的Makefile -n-仅输出执行过程中的命令序列,但并不执行 -s-全面禁止命令的显示-t-更新目标文件的时间-q-不运行命令,也不输出。仅仅是检查

10、所指定的目标是否需要更新。 如果是0则说明要更新,如果是2则说明有错误发生。 -i-在执行时忽略所有的错误 -h-显示帮助信息-o -指定生成的文件名称-p-输出Makefile中的所有数据,包括所有的规则和变量。-qp输出信息而不执行Makefilep f /dev/null查看执行Makefile前的预设变量和规则Makefile 的运行Makefile的运行参数“debug=” 输出make的调试信息。它有几种不同的级别可供选择,如果没有参 数,那就是输出最简单的调试信息。下面是的取值: a 也就是all,输出所有的调试信息。(会非常的多) b 也就是basic,只输出简单的调试信息。即

11、输出不需要重编译 的目标。 v 也就是verbose,在b选项的级别之上。输出的信息包括哪个 Makefile被解析,不需要被重编译的依赖文件(或是依赖目标)等。 i 也就是implicit,输出所以的隐含规则。 j 也就是jobs,输出执行规则中命令的详细信息,如命令的PID、 返回码等。 m 也就是Makefile,输出make读取Makefile,更新Makefile,执 行Makefile的信息。-d-默认等同于 d=a隐含规则 特点是Makefile默认运行的规则可使用系统变量可自定义隐含规则显式规则优于隐含规则隐含规则 隐含规则实例foo : foo.occ o foo foo.o

12、等价于foo.o : foo.ccc c foo.c 隐含规则一览 编译C程序的隐含规则 “.o”的目标的依赖目标会自动推导为“.c”,并且其生成命令是$(CC) c $(CPPFLAGS) $(CFLAGS)编译C+程序的隐含规则编译Pascal程序的隐含规则编译Fortran/Ratfor程序的隐含规则预处理Fortran/Ratfor程序的隐含规则汇编和汇编预处理的隐含规则 链接Object文件的隐含规则 “”目标依赖于“.o”,通过运行C的编译器来运行链接程序生成, 其生成命令是:$(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS)自定义隐性规则 规则语

13、法在目标定义中使用“%” 规则实例%.o : %.c$(CC) -c $(CFLAGS) $(CPPFLAGS) $ -o $%.tab.c %.tab.h: %.ybison -d $ 重载内建隐含规则 %.o : %.c $(CC) -c $(CPPFLAGS) $(CFLAGS) -D$(date) 老式风格的“后缀规则“ 双后缀定义一对后缀:目标文件的后缀和依赖目标的后缀。例如“.c.o”相当 于“%o : %c”单后缀定义一个后缀,也就是依赖目标的后缀。例如“.c“相当于“% : %.c“ 自定义后缀伪目标.SUFFIXES: .pco .cob .pc自定义隐性规则自动化变量列表

14、$表示规则中的目标文件集。 $%仅当目标是函数库文件中,表示规则中的目标成员名 。 $依赖目标中的第一个目标名字。 $?所有比目标新的依赖目标的集合,以空格分隔。 $所有的依赖目标的集合,以空格分隔。如果在依赖目标 中有多个重复的,那个这个变量会去除重复的依赖目标, 只保留一份。 $+这个变量很像“$“,也是所有依赖目标的集合。只是它 不去除重复的依赖目标。 $* 这个变量表示目标模式中“%“及其之前的部分。隐含规则搜索算法找到目标文件创建目标文件和依赖文件的规则列表测试是否所有的依赖文件都存在或是理当存在 如果存在或是理当存在,形成规则执行规则其相当的命令,并加载自定义变量 Makefile的应用实例谢谢

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号