15 - make 中的隐式规则概述

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

文章目录

  • [1. 隐式规则:同名目标时](#1. 隐式规则:同名目标时)
  • [2. 什么是隐式规则](#2. 什么是隐式规则)
  • [3. 深入理解隐式规则](#3. 深入理解隐式规则)
  • [4. 查看隐式规则](#4. 查看隐式规则)
  • [5. 后缀规则](#5. 后缀规则)

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
  • 关于后缀规则的注意事项
    后缀规则中不允许有依赖
    后缀规则中必须有命令,否则无意义
    后缀规则将逐步被模式规则取代
相关推荐
djjjx.2 天前
Linux工具篇 (三):make与Makefile
linux·服务器·makefile·make
yanlaifan17 天前
Makefile文件---伪目标PHONY
makefile
拂拉氏23 天前
【Linux】 开发工具(Makefile、git、cgdb)解析与对于操作系统的基础认识
linux·git·操作系统·makefile·cgdb
琥珀色糖1 个月前
Linux makefile
linux·运维·服务器·makefile·make
jufeng13071 个月前
【系列:MiniKV 原理剖析 · 第 6 篇】
linux·软件工程·个人开发·makefile
jufeng13071 个月前
【系列:MiniKV 原理剖析 · 第 8 篇(完结篇)】
linux·c++·log4j·软件工程·makefile
hjjdebug3 个月前
buildroot 入门介绍
makefile·buildroot
hjjdebug3 个月前
buildroot Makefile include *.mk 的玄机.
makefile·buildroot
Zevalin爱灰灰3 个月前
makefile从入门到实战 第一章 认识makefile(二)
makefile
Zevalin爱灰灰3 个月前
makefile从入门到实战 第一章 认识makefile(一)
linux·makefile