11-自动生成依赖关系(上)

1. 头文件依赖

1.1 头文件带来的思考

  • .o文件并不仅仅依赖源文件,也有可能依赖头文件
  • 预处理器将头文件中的代码直接插入源文件,编译器只通过源文件通过预处理后的源文件产生目标文件,因此规则中仅仅以源文件作为依赖,当被依赖的头文件被修改后,命令可能无法执行

1.2 示例分析

思考下面的 makefile 有没有问题?

在这里插入图片描述

结果分析:main.cfunc.c 都依赖于func.h,但是这个依赖关系并没有写入makefile中,所以当头文件修改时并不会触发相应的规则

初步解决方案:

OBJS:=func.o main.o
hello.out:4(OBJS)
	@gcc -o @@ $^
$(OBJS):%.o:%.c func.h   // 将.h头文件直接写入每条规则的依赖中
 	@gcc -o $@ -c $<

对于这种小一点的项目这种方案的确可行,但是如果项目非常大,将所有的头文件直接包含进所有的规则中,那么只要有一个头文件被修改时那么所有的规则都需要重新执行一遍

2 自动生成依赖关系

2.1 疯狂的想法

  • 通过命令自动生成对头文件的依赖
  • 将生成的依赖自动包含进 makefile 中
  • 当头文件修改后,自动确认需要重新编译的文件

2.2 预备工作

2.2.1 Linux 中的 sed
  • sed 是一个流编辑器,用于流文本的修改
  • sed 可用于流文本中的字符串的替换
  • sed 的字符串替换方式为 : sed 's:src:des:g'
    在这里插入图片描述
  • sed 支持正则表达式
    在这里插入图片描述
2.2.2 gcc 编译选项
  • gcc -M 源文件,将产生这个源文件所有的依赖,包括系统级别的依赖
  • gcc -MM 源文件,将产生这个源文件部份依赖(不包括系统库的一些依赖)
  • gcc -MM -E 或则 gcc -M -E 只激活预处理(优化)
2.2.3 拆分目标文件

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值