makefile的隐式规则
target := exe source_code = hello.c OBJS = $(source_code:.c=.o) $(target):$(OBJS)
gcc $^ -o $@ clean:
$(RM) $(target) $(OBJS)
一上来直接展示一份makefile代码。
功能: 从功能角度来说,这份makefile代码可以编译出对应的目标文件,并且顺利执行。
思考: 这其实是一份质量不合格的makefile代码。请仔细观察。
。。。。 什么 ? 你看着这个makefile却一点都不觉得奇怪吗?(好吧,难道你平时写makefile都是这样写的? )
下面我们通过实验来讲解。
做点简单修改,还是上面这份makefile,只修改编译器, 更换为交叉编译器来试试,贴代码:
target := exe source_code = hello.c OBJS = $(source_code:.c=.o) $(target):$(OBJS)
/usr/external-toolchain/bin/arm-linux-gnueabi-gcc $^ -o $@ clean:
$(RM) $(target) $(OBJS)
功能:请问现在更换为交叉编译器,还能编译出正确的目标文件吗?
编译观察:

令人吃惊的答案:编译报错!
解答:
这里的玄机是makefile的一个暗黑操作:隐式规则。
做一下简单修改即可:使用预定义的CC 这会改变隐式规则的行为。修改为如下图所示代码:
target := exe CC := /usr/external-toolchain/bin/arm-linux-gnueabi-gcc source_code = hello.c OBJS = $(source_code:.c=.o) $(target):$(OBJS)
$(CC) $^ -o $@
clean:
$(RM) $(target) $(OBJS)
这样就能顺利编译出目标文件了。

这里通过使用CC变量能够顺利编译出目标文件, 本质还是使用了隐式规则,即makefile在执行make对应的规则内的命令时,发现却没有有效的汇编文件:
于是通过默认的gcc编译器尝试将本地的XX.c文件去编译为XX.o文件。
如果本地没有XX.c文件,有一个XX.p或者XX.cpp文件,make的这种隐式规则也会去将其编译为汇编文件。
如果XX.p和XX.cpp同时存在,是选择XX.p还是XX.cpp,这由make的隐式规则决定。
可以通过 make -p|grep "文件格式" 查看隐式规则的这部分相关内容:

还是使用这份代码来分析。注意:我们使用的编译器是交叉编译器哦!

.
makefile的隐式规则的更多相关文章
- makefile如果没有符合的显式规则将会使用隐式规则
举例: 当前目录下有个Makefile和jello.c文件,其中有这样的规则jello.o:%.c %.h Makefile (静态模式规则),表明的含义为:要生成的jello.o目标依赖jello. ...
- 第十五篇 make中的隐式规则概述
前面我们讲到了makefile的依赖拆分的知识,现在可以引申出这样一个问题,如果同一个目标的不同命令拆分的写到不同地方会发生什么?下面我们给出程序和执行结果: 可见后面的命令会覆盖前面的命令, ...
- 第15课 - make的隐式规则(上)
第15课 - make的隐式规则(上) 1. 问题 如果把同一个目标的命令拆分的写到不同地方,会发生什么? 执行make all 这个实验表明了:如果同一个目标的命令拆分的写到不同地方,那么 make ...
- 第16课 - make的隐式规则(下)
第16课 - make的隐式规则(下) 1
- 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则未经解析。
SELECT CONVERT(VARCHAR(100), 列名) FROM Table 提示错误: 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则 ...
- Android学习笔记_17_Intent匹配规则(隐式意图)
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行 ...
- MySQL隐式转化整理
MySQL隐式转化整理 前几天在微博上看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写的很不错,再加上自己之前也对MySQL的隐式转化这边并不是很清楚,所以就顺势整理了一下.希望对大家有所帮 ...
- 利用UICollectionViewFlowLayout的隐式动画实现UICollectionView的layout的动画调整(外加放大指定cell效果)
前几天在gitHub看到个不错的效果,就是DaiExpandCollectionView,效果如图: 所以赶紧下下来源码看看他怎么实现的,打开源码看了半天,发现他没写什么关于动画的代码啊... 经 ...
- 深入理解javascript原型和闭包(4)——隐式原型
注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...
随机推荐
- LeetCode 94 | 基础题,如何不用递归中序遍历二叉树?
今天是LeetCode专题第60篇文章,我们一起来看的是LeetCode的94题,二叉树的中序遍历. 这道题的官方难度是Medium,点赞3304,反对只有140,通过率有63.2%,在Medium的 ...
- 手摸手 Elastic Stack 使用教程 - 环境安装
前言 在日常的开发中,会涉及到对一些中间件以及基础组件的使用,日志汇总分析.APM 监控.接口的健康检查.站内搜索,以及对于服务器.nginx.iis 等等的监控,最近的几个需求点,都和 Elasti ...
- Python画图库Turtle库详解篇
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...
- .net 安装部署诀窍
1.解决方案资源管理器中有多个类库项目和一个启动主项目时:各类库项目的生成路径设为bin\debug: 启动主项目的生成路径设成指定的主输出路径: 2.打包时在应用程序文件夹中添加主输出即可,主输出的 ...
- windows-服务器-配置一个及多个-Apache-Tomcat
问题:如何在一台服务器上发布了几个Tomcat的系统???怎么配置环境变量?怎么设置Tomcat? 2020/8月更新,由于之前的java的环境变量有点绕,此次新加一个流程设计图 一.需求: 一台wi ...
- Left Mouse Button (bfs)
Mine sweeper is a very popular small game in Windows operating system. The object of the game is to ...
- Jemter响应数据乱码
问题分析: 请求响应数据出现中文时,通过查看jemter的察看结果树中的响应数据信息,出现乱码.经过查看jemter的配置文件jmeter.properties发现其默认字符集编码为ISO-8859- ...
- Tomcat三实例cluster多播方案共享session再配置
昨天已经将两实例cluster多播方案共享Session配置成功,其中的关键就在于server.xml中,engine->channel->receiver节点中address得写成自己的 ...
- Linux:apache安装
1.查询是否已安装 rpm -qa httpd 如果已安装,先卸载 发现有依赖包,先把依赖卸载 或者加上--nodeps参数,不考虑依赖,直接卸载 rpm -e --nodeps httpd-2. ...
- ui自动化---WebDriverApi接口
一.webdriver client原理 当测试脚本启动Chrome的时候,selenium-webdriver 会首先在新线程中启动Chrome浏览器.启动后selenium-webdriver会将 ...