15-16 - make 中的隐式规则概述

---- 整理自狄泰软件唐佐林老师课程

1. 隐式规则:同名目标时

  • 问题:如果同一个目标的命令拆分的写到不同地方,会发生什么?

在这里插入图片描述
在这里插入图片描述

  • makefile 中出现同名目标时:
    • 依赖:所有的依赖将合并到一起,成为目标的最终依赖
    • 命令:当多处出现同一目标的命令时,make 发出警告;所有之前定义的命令被最后定义的命令取代

在这里插入图片描述

  • 注意事项:
    当使用 include 关键字包含其它文件时,需要确保被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖

2. 什么是隐式规则

  • make 提供了生成目标文件的隐式规则(一些常用的,例行的规则实现)
  • 当相应目标的规则未提供时,make 尝试使用隐式规则
  • 隐式规则会使用预定义变量完成编译工作
  • 改变预定义变量将部分改变隐式规则的行为
  • 当存在自定义规则时,不再使用隐式规则

在这里插入图片描述

3. 深入理解隐式规则

  • 当 make 发现目标的依赖不存在时:
    尝试通过依赖名逐一查找隐式规则
    并且通过依赖名推导可能需要的源文件

在这里插入图片描述

  • 隐式规则的副作用:
    编译行为难以控制:大量使用隐式规则可能产生意想不到的编译行为
    编译效率低下:make 从隐式规则和自定义规则中选择最终使用的规则

  • 隐式规则链
    当依赖的目标不存在时,make 会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为
    例如:需要名为 N.o 的目标:

在这里插入图片描述

4. 查看隐式规则

  • 查看所有:make -p
  • 查看具体规则:make -p | grep "xxx"

在这里插入图片描述

  • 隐式规则的禁用
    局部禁用:在 makefile 中自定义规则;在 makefile 中定义模式(如:%.o:%.p
    全局禁用:make -r

5. 后缀规则

  • 后缀规则是旧式的“模式规则”
  • 可以通过后缀描述的方式自定义规则

在这里插入图片描述

  • 双后缀规则:定义一对文件后缀(依赖文件后缀和目标文件后缀)
    如:.cpp.o <==> %.o:%.cpp
  • 单后缀规则:定义单个文件后缀(源文件后缀)
    如:.c <==> %:%.c
  • 关于后缀规则的注意事项
    后缀规则中不允许有依赖
    后缀规则中必须有命令,否则无意义
    后缀规则将逐步被模式规则取代

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuxiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值