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
  • 关于后缀规则的注意事项
    后缀规则中不允许有依赖
    后缀规则中必须有命令,否则无意义
    后缀规则将逐步被模式规则取代
相关推荐
vv_a18 天前
5规则中的命令
makefile
DieSnowK2 个月前
[项目][WebServer][Makefile & Shell]详细讲解
开发语言·c++·http·makefile·shell·项目·webserver
橘子真甜~2 个月前
Linux基础3-基础工具3(make,makefile,gdb详解)
linux·运维·服务器·makefile·make·gbd
zhangzhangkeji2 个月前
make 程序规定的 makefile 文件的书写语法
makefile·make
Betty’s Sweet2 个月前
[Linux]:环境开发工具
linux·git·vim·makefile·gdb·gcc·g++
笑川 孙3 个月前
Linux | Linux开发工具链全攻略:yum、vim、gcc/g++、GDB、Makefile与git版本控制
linux·c++·git·vim·makefile·gcc·g++
DieSnowK4 个月前
[C++][CMake][嵌套的CMake]详细讲解
开发语言·c++·makefile·make·cmake·新手向·详细讲解
DieSnowK4 个月前
[C++][CMake][CMake基础]详细讲解
开发语言·c++·makefile·make·cmake·新手向·详细讲解
__xu_4 个月前
Makefile中strip函数的用法
makefile·strip