网站大量收购独家精品文档,联系QQ:2885784924

20XX年Make及makefile文件的编写培训课程.ppt

  1. 1、本文档共91页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
变量MAKELEVEL 在多级递归调用的 make 执行过程中。变量“MAKELEVEL”代表了调用的深度。 最上一级时“MAKELEVEL”的值为“0”、下一级时为“1”、再下一级为“2” : 命令行选项和递归 在 make的递归执行过程中。最上层(可以称之为主控)make的命令行选项“-k”、“-s”等被自动的通过环境变量“MAKEFLAGS”传递给子 make 进程。 在主控执行make时使用“-k”和“-s”选项,那么“MAKEFLAGS”的值就为“ks” “-C”、“-f”、“-o”和“-W,这些命令行选项不会被赋值给变量“MAKEFLAGS” 定义命令包 什么是命令包? 类似C语言中的自定义函数 语法格式: define 名称 命令块 endef 命令包的使用和对变量的使用一样 foo.c : foo.y $(run-yacc) define run-yacc yacc $(firstword $^) mv y.tab.c $@ endef 自动化变量 举例 LIBS = libtest.a foo : foo.c | $(LIBS) $(CC) $(CFLAGS) $ -o $@ $(LIBS) 执行make时,如果foo.c修改了,目标foo会重建,libtest.a修改了,foo不会重建 libtest.a只有在foo不存在的情况下,才会参与规则的执行。 文件名使用通配符 可使用的通配符有:“*”、“?” Makefile中统配符可以出现在以下两种场合: 1. 可以用在规则的目标、依赖中,此时 make会自动将其展开; 2. 可出现在规则的命令中,其展开是在 shell 在执行此命令时完成。 变量定义中使用的通配符不会被展开。变量objects = *.o”。那么变量“objects”的值就是“*.o”。 需要变量“objects”代表所有的.o 文件,使用函数“wildcard”来实现(objects = $(wildcard *.o))。 函数wildcard 在规则中,通配符会被自动展开。 在变量的定义和使用函数时,通配符不会被自动展开。这种情况下需要通配符有效,要用到函数“wildcard” 语法格式:$(wildcard PATTERN...) 目录搜索 在一个较大的工程中,一般会把源码文件和2进制 文件(.o文件和可执行文件)安排在不同的目录来进行区分管理。 需要使用 make提供的目录自动搜索依赖文件功能 VPATH变量 通过变量“VPATH”可以指定依赖文件的搜索路径。 在规则的依赖文件在当前目录不存在时,make会在此变量所指定的目录下去寻找这些依赖文件 变量“VPATH”的定义中,使用空格或者冒号(:)将多个目录分开。make 搜索的目录顺序按照变量“VPATH”定义中顺序进行(当前目录永远是第一搜索目录)。 举例:VPATH = src:../headers,指定两个搜索目录,分别是src和../headers Makefile的伪目标 伪目标: 它不代表一个真正的文件名,在执行 make时可以指定这个目标来执行其所在规则定义的命令 有时我们也可以将一个伪目标称为标签 使用伪目标的原因 1. 避免在 Makefile 中定义的只执行命令的的目标(此目标的目的为了执行执行一些列命令,而不需要创建这个目标)和工作目录下的实际文件出现名字冲突。 2. 提高执行 make 时的效率。 避免和实际文件名冲突 clean: rm *.o temp 执行make clean,如果目录下没有clean文件,执行结果与要求一致,删除所有.o文件和temp目录 如果目录下有clean文件,会怎么样? 规则没有依赖文件,目标会被认为是最新的,而不去执行规则的命令。这不是我们的初衷。 把clean明确声明为伪目标。 将一个目标声明为伪目标需要将它作为特殊目标“.PHONY”的依赖 .PHONY : clean 伪目标规则的书写 首先需要声明目标是一个伪目标 然后是伪目标的规则定义。 举例: .PHONY: clean clean: rm *.o temp 这里clean是人为定义的伪目标,可以是任何一个合法的名字。 伪目标的依赖 应用场合 1.创建当前目录下的多个应用程序 2.分类执行不同的动作 创建当前目录下的多个应用程序 约定的做法是使用一个称为“all”的伪目标来作为终极目标 all : prog1 prog2 prog3 .PHONY : all prog1 : prog1.o utils.o cc -o prog1 prog1.o utils.o prog2 : prog2.o cc -

文档评论(0)

kanghao1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档