#跟我一起写 Makefile# 隐含规则使用隐含规则
目录
隐含规则
使用隐含规则
隐含规则
在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj]文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。
“隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的Makefile中没有书写这样的规则。例如,把[.c]文件编译成[.o]文件这一规则,你根本就不用写出来,make会自动推导出这种规则,并生成我们需要的[.o]文件。
“隐含规则”会使用一些我们系统变量,我们可以改变这些系统变量的值来定制隐含规则的运行时的参数。如系统变量“CFLAGS”可以控制编译时的编译器参数。
我们还可以通过“模式规则”的方式写下自己的隐含规则。用“后缀规则”来定义隐含规则会有许多的限制。使用“模式规则”会更回得智能和清楚,但“后缀规则”可以用来保证我们Makefile的兼容性。
我们了解了“隐含规则”,可以让其为我们更好的服务,也会让我们知道一些“约定俗成”了的东西,而不至于使得我们在运行Makefile时出现一些我们觉得莫名其妙的东西。当然,任何事物都是矛盾的,水能载舟,亦可覆舟,所以,有时候“隐含规则”也会给我们造成不小的麻烦。只有了解了它,我们才能更好地使用它。
使用隐含规则
如果要使用隐含规则生成你需要的目标,你所需要做的就是不要写出这个目标的规则。那么,make会试图去自动推导产生这个目标的规则和命令,如果make可以自动推导生成这个目标的规则和命令,那么这个行为就是隐含规则的自动推导。当然,隐含规则是make事先约定好的一些东西。例如,我们有下面的一个Makefile:
foo : foo.o bar.occ –o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
我们可以注意到,这个Makefile中并没有写下如何生成foo.o和bar.o这两目标的规则和命令。因为make的“隐含规则”功能会自动为我们自动去推导这两个目标的依赖目标和生成命令。
make会在自己的“隐含规则”库中寻找可以用的规则,如果找到,那么就会使用。如果找不到,那么就会报错。在上面的那个例子中,make调用的隐含规则是,把[.o]的目标的依赖文件置成[.c],并使用C的编译命令“cc –c $(CFLAGS) [.c]”来生成[.o]的目标。也就是说,我们完全没有必要写下下面的两条规则:
foo.o : foo.ccc –c foo.c $(CFLAGS)
bar.o : bar.ccc –c bar.c $(CFLAGS)
因为,这已经是“约定”好了的事了,make和我们约定好了用C编译器“cc”生成[.o]文件的规则,这就是隐含规则。
当然,如果我们为[.o]文件书写了自己的规则,那么make就不会自动推导并调用隐含规则,它会按照我们写好的规则忠实地执行。
还有,在make的“隐含规则库”中,每一条隐含规则都在库中有其顺序,越靠前的则是越被经常使用的,所以,这会导致我们有些时候即使我们显示地指定了目标依赖,make也不会管。如下面这条规则(没有命令):
foo.o : foo.p
依赖文件“foo.p”(Pascal程序的源文件)有可能变得没有意义。如果目录下存在了“foo.c”文件,那么我们的隐含规则一样会生效,并会通过“foo.c”调用C的编译器生成foo.o文件。因为,在隐含规则中,Pascal的规则出现在C的规则之后,所以,make找到可以生成foo.o的C的规则就不再寻找下一条规则了。如果你确实不希望任何隐含规则推导,那么,你就不要只写出“依赖规则”,而不写命令。
#跟我一起写 Makefile# 隐含规则使用隐含规则相关推荐
- 跟我一起写makefile: 概述、介绍、规则
跟我一起写makefile 概述.介绍.规则 转自:https://seisman.github.io/how-to-write-makefile/rules.html 概述 什么是makefile? ...
- 跟我一起写 Makefile -- 陈皓
跟我一起写 Makefile(一) 概述 关于程序的编译和链接 Makefile 介绍 一.Makefile的规则 二.一个示例 跟我一起写 Makefile(二) 三.make是如何工作的 四.ma ...
- linux写makefile用tab报错,隐含规则 - linux makefile教程
隐含规则 ---- 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj ...
- C语言的本质(37)——makefile之隐含规则和模式规则
Makefile有很多灵活的写法,可以写得更简洁,同时减少出错的可能.本节我们来看看这样一个例子还有哪些改进的余地. 一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写,例如: main.o ...
- 跟我一起写 Makefile(整理版)
跟我一起写 Makefile 作者:陈皓 (博客地址:http://blog.csdn.net/haoe ...
- 跟我一起写 Makefile(十三)
五.定义模式规则 你可以使用模式规则来定义一个隐含规则.一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有"%"字符."%"的意思是表示一个或多个 ...
- 跟我一起写 Makefile(十二)
隐含规则 ---- 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj ...
- 跟我一起写 Makefile(十一)
make 的运行 ------ 一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的.但也有时你也许只想让make重编译某些文件,而不 ...
- 教你写Makefile
转载文 Makefile 值得一提的是,在Makefile中的命令,必须要以[Tab]键开始. 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都 ...
最新文章
- Linux下Tomcat的安装配置
- pfSense设置多WAN后,解决网银无法登陆问题
- 人脸识别 性能评价指标
- 指尖检测的几种新方法
- chap10 构建Web内容的技术
- 全网最全程序员效率工具及小技巧
- Yet Another Counting Problem CodeForces - 1342C(规律+前缀和)
- 有限元课堂笔记03:钢架(Frame)
- HDU 3590 PP and QQ(反nim博弈,删边游戏)
- 照片识别出错_AI跨年龄人脸识别技术在跨年龄寻亲的应用简析
- C#打开php链接传参然后接收返回值
- 松鼠会啊松鼠会,22号来杭州啦
- 在IDEA集成Github
- windows消息处理机制和VB
- Wherehows项目简介
- 方差分析表和回归分析表的那些浆糊糊
- 关于win10自带邮箱绑定163邮箱的设置
- python 自动化发送邮件_Python自动化必备发送邮件报告脚本详解
- 兄弟连学python(06)装饰器:对类或者函数进行功能的扩展
- 使用Sivarc使PLC程序标准化
热门文章
- 轩辕传奇服务器维护,轩辕传奇12月17日更新公告_轩辕传奇12月17日部分服务器停服更新公告_牛游戏网...
- 银行兴起数字极简风:“智能手机App恐惧症”终于有救了
- pytorch深度学习参加平安银行数据大赛,从驾驶行为预测驾驶风险
- “2021年度ICT产业龙虎榜”揭晓,九州云喜提“双黄蛋”
- XMind使用技巧1
- 马来西亚Exabytes商家域名注册过程及可用域名优惠
- DSLR Video Tips: Technical Knowledge 数码单反相机视频提示:技术知识 Lynda课程中文字幕
- 一个完整的Java项目涉及的技术点有哪些
- 亚马逊云科技Build On - Serverless创新零售初体验
- 网络工程 网络基础阶段一笔记