前面我们讲到了makefile的依赖拆分的知识,现在可以引申出这样一个问题,如果同一个目标的不同命令拆分的写到不同地方会发生什么?下面我们给出程序和执行结果:
 
可见后面的命令会覆盖前面的命令,我们可以得到以下结论:
 
我们主观上要避免在多处出现同一目标的不同命令,但是在include一个文件时,往往不自觉的引入这种问题,因此,当使用include关键字包含其他文件时,需要确保被包含文件中的同名目标只有依赖,没有命令,否则同名目标的命令将被覆盖。
  
  下面来具体介绍make的隐式规则,make包含了一个巨大的库,其提供了一些常用的、例行的规则实现,当相应的目标规则未提供时,make尝试使用隐式规则。
看下面一段程序与其make输出:
 
我们在makefile中并没有提供生成$(OBJS)的规则,但是最终依然成功生成了这些文件,这便是make的隐式规则,其自动查找自身的库,找到合适的规则,并用来生成目标文件。make的隐式规则有以下特性:
 
下面深入理解一下make的隐式规则:
 
make的隐式规则很强大,但也带来了很大的副作用:
1、编译行为难以控制,大量使用隐式规则可能产生意想不到的编译行为。
2、编译效率低下,make从隐式规则和自定义规则中选择最终使用的规则。
 
make还可能会产生隐式规则链,当依赖的目标不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为。例如,需要N.o的目标,make可能会组合成N.y->N.c->N.o规则链。
 
 使用make -p可以查看make提供的所有隐式规则,执行make -p | grep "%.o",可以得到以下结果:
 
在工程中,我们应该禁用make的隐式规则,其中包括局部禁用和全局禁用,如下所示:
 
后缀规则简介:
 
后缀规则又分为双后缀规则和单后缀规则,它们与现在的模式规则的对应关系分别如下:
 
 
后缀规则中不允许有依赖,后缀规则必须有命令,否则无意义,后缀规则将逐步被模式规则取代。
 
小结:
1、隐式规则可能造成意想不到的行为。
2、在实际工程项目中,尽量不要使用隐式规则。
3、后缀规则是一种陈旧的模式规则,其正在被模式规则取代。
 
 
参考如下:
   狄泰软件教程及课件

   gun make手册
   专业嵌入式软件开发
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

第十五篇 make中的隐式规则概述的更多相关文章

  1. Egret入门学习日记 --- 第十五篇(书中 6.1~6.9节 内容)

    第十五篇(书中 6.1~6.9节 内容) 好的,昨天完成了第五章. 今天来看第六章. 总结重点: 1.如何对组件进行分组? 跟着做: 重点1:如何对组件进行分组? 首先,选中你想要组合的组件. 然后点 ...

  2. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  3. Python之路【第十五篇】:Web框架

    Python之路[第十五篇]:Web框架   Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...

  4. 第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  5. 【译】第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  6. 跟我学SpringCloud | 第十五篇:微服务利剑之APM平台(一)Skywalking

    目录 SpringCloud系列教程 | 第十五篇:微服务利剑之APM平台(一)Skywalking 1. Skywalking概述 2. Skywalking主要功能 3. Skywalking主要 ...

  7. 十五、struts2中的拦截器(框架功能核心)

    十五.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 功能是一回事. 过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面 ...

  8. 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧

    目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...

  9. 深入探究js中的隐式变量声明

    前两天遇到的问题,经过很多网友的深刻讨论,终于有一个相对可以解释的通的逻辑了,然后我仔细研究了一下相关的点,顺带研究了一下js中的隐式变量. 以下文章中提到的隐式变量都是指没有用var,let,con ...

随机推荐

  1. ROS编译时(catkin_make)找不到bullet,Could NOT find Bullet (missing: BULLET_DYNAMICS_LIBRARY

    sudo apt-get install libbullet-dev

  2. ubuntu14.04上 nginx启动停止

    sudo service nginx stop  停止 sudo nginx   启动

  3. c++ 多继承 公有,私有,保护

    昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些 ...

  4. pandas.read_csv参数整理

    读取CSV(逗号分隔)文件到DataFrame,也支持文件的部分导入和选择迭代 更多帮助参见:http://pandas.pydata.org/pandas-docs/stable/io.html 参 ...

  5. 《剑指offer》第二十一题(调整数组顺序使奇数位于偶数前面)

    // 面试题21:调整数组顺序使奇数位于偶数前面 // 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有 // 奇数位于数组的前半部分,所有偶数位于数组的后半部分. #inclu ...

  6. 移动端视频h5表现问题汇总

    1. 同屏播放视频 <video src="" x-webkit-airplay="true" webkit-playsinline="true ...

  7. CentOS7 install apache

    1. yum install httpd 2. config /etc/httpd/conf/httpd.conf <VirtualHost *:80>  ServerName www.l ...

  8. 55. 45. Jump Game II *HARD*

    1. Given an array of non-negative integers, you are initially positioned at the first index of the a ...

  9. 李阳音标速成MP3文本

    第一节:前元音 No. 1 [i:]穿针引线长衣音,简称"长衣音" 字母:e字母:ee 字母:ea字母:ie字母:ei 其发音要领是发音时舌尖抵下齿,前舌尽量抬高.舌位高于/i/: ...

  10. Snagit安装步骤

    Snagit安装步骤 1解压文件 2运行文件下一步下一步 3拷贝汉化文件到安装目录 安装目录  D:\home\user\TechSmith\snagit 成功