gcc自动生成依赖文件.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
gcc自动生成依赖文件

那么,编译器的这个功能如何与我们的Makefile联系在一起呢。因为这样一来,我们的Makefile也要根据这些源文件重新生成,让Makefile自已依赖于源文件?这个功能并不现实,不过我们可以有其它手段来迂回地实现这一功能。GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件中,为每一个“name.c”的文件都生成一个“name.d”的Makefile文件,[.d]文件中就存放对应[.c]文件的依赖关系。 于是,我们可以写出[.c]文件和[.d]文件的依赖关系,并让make自动更新或自成[.d]文件,并把其包含在我们的主Makefile中,这样,我们就可以自动化地生成每个文件的依赖关系了。 %.d: %.c @set -e; rm -f $@; \ $(CC) -M $(CPPFLAGS) $ $@.$$$$; \ sed s,\($*\)\.o[ :]*,\1.o $@ : ,g $@.$$$$ $@; \ rm -f $@.$$$$ 执行:make 文件名.d 解释如下: 第一行不用多说; 第二行:@set -e; rm -f $@; \ 1. @set -e;?? \\ @表示makefile执行这条命令时不显示出来,? \\ set -e; 表示此脚本在执行时返回非零的值,此脚本将终止运行,查找帮助文件如下:make就会终止执行当前规则,这将有可能终止所有规则的执行。 如果想忽略错误,可以在命令行前加一个减号“-”。 例:clean: -rm –f *.o 还有一个全局的办法是,给make加上“-i”或是“--ignore-errors”参数,那么,Makefile中所有命令都会忽略错误。而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。 还有一个要提一下的make的参数的是“-k”或是“--keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。 ricky@ubuntu:~$ help set -e? Exit immediately if a command exits with a non-zero status. (Using + rather than - causes these flags to be turned off.\\) 2. rm -f $@;? 删除生成的目标文件(即 *.d) 第三行: $(CC) -M $(CPPFLAGS) $ $@.$$$$; \ 1. $(CC) -M $(CPPFLAGS) $ $ 依赖的目标集(即 *.c) , -M: 表示生成文件依赖关系, 2. $@.$$$$ 重定向输出, $@:表示生成的目标文件(即 *.d), $$: 表示本身的Process ID 总的意思就是: 将a.c 文件生成的依赖关系报存在a.d.1212 文件中.(假设 a.c 为文件名, 12为Process ID). 备注: 编译依赖文件,并把它的名字根据进程号命名成一个临时文件,用进程号命名是一个技巧,这样重名的可能性很小. 第四行: sed s,\($*\)\.o[ :]*,\1.o $@ : ,g $@.$$$$ $@; \ 这一行用到了sed编辑器, sd是stream editor的缩写,流编辑器的意思.它可以对来自文件或者标准输入的输入流进行变换, 它常被用作管道中的过滤器.详细可以查看帮助文档. sed命令的结构是s,match,replace,g, 其中s后面的,号就是常见的\,一般写成s\pattern\pattern\的形式,但也可以把\替换成其他符号,比如这里是逗号。g是全局的意思,具体你查查sed。match和replace都是正则表达式。match部分,要先解析makefile的元字符,$*和$@,这个你查查 makefile。\(\)是为了后面的引用,后面的\1就是引用这里\(和\)之间括起的部分模式。[ :]也很好理解,你查查正则表达式的文档。 s,match,replace,g 对应 s,\($*\)\.o[ :]*,\1.o $@ : ,g 分别对应如下: s = s match = \($*\)\.o[ :]*??????????? \\ 需要熟悉正则表达式 replace = \1.o $@ : ??? ??? ? \\ 需要熟悉正则表达式 ???? g = g 即第四行可以写为: sed sed_cmd $@.$$$$ $@; $@.$$$$ 表示sed 处理的数据为$@.$$$$文件内容,就是上面生成的临时文件(a.d.1212),? $@

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档