目录

隐含规则

使用隐含规则


隐含规则

在我们使用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# 隐含规则使用隐含规则相关推荐

  1. 跟我一起写makefile: 概述、介绍、规则

    跟我一起写makefile 概述.介绍.规则 转自:https://seisman.github.io/how-to-write-makefile/rules.html 概述 什么是makefile? ...

  2. 跟我一起写 Makefile -- 陈皓

    跟我一起写 Makefile(一) 概述 关于程序的编译和链接 Makefile 介绍 一.Makefile的规则 二.一个示例 跟我一起写 Makefile(二) 三.make是如何工作的 四.ma ...

  3. linux写makefile用tab报错,隐含规则 - linux makefile教程

    隐含规则 ---- 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj ...

  4. C语言的本质(37)——makefile之隐含规则和模式规则

    Makefile有很多灵活的写法,可以写得更简洁,同时减少出错的可能.本节我们来看看这样一个例子还有哪些改进的余地. 一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写,例如: main.o ...

  5. 跟我一起写 Makefile(整理版)

                      跟我一起写 Makefile                     作者:陈皓           (博客地址:http://blog.csdn.net/haoe ...

  6. 跟我一起写 Makefile(十三)

    五.定义模式规则 你可以使用模式规则来定义一个隐含规则.一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有"%"字符."%"的意思是表示一个或多个 ...

  7. 跟我一起写 Makefile(十二)

    隐含规则 ---- 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj ...

  8. 跟我一起写 Makefile(十一)

    make 的运行 ------ 一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的.但也有时你也许只想让make重编译某些文件,而不 ...

  9. 教你写Makefile

    转载文 Makefile 值得一提的是,在Makefile中的命令,必须要以[Tab]键开始. 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都 ...

最新文章

  1. Linux下Tomcat的安装配置
  2. pfSense设置多WAN后,解决网银无法登陆问题
  3. 人脸识别 性能评价指标
  4. 指尖检测的几种新方法
  5. chap10 构建Web内容的技术
  6. 全网最全程序员效率工具及小技巧
  7. Yet Another Counting Problem CodeForces - 1342C(规律+前缀和)
  8. 有限元课堂笔记03:钢架(Frame)
  9. HDU 3590 PP and QQ(反nim博弈,删边游戏)
  10. 照片识别出错_AI跨年龄人脸识别技术在跨年龄寻亲的应用简析
  11. C#打开php链接传参然后接收返回值
  12. 松鼠会啊松鼠会,22号来杭州啦
  13. 在IDEA集成Github
  14. windows消息处理机制和VB
  15. Wherehows项目简介
  16. 方差分析表和回归分析表的那些浆糊糊
  17. 关于win10自带邮箱绑定163邮箱的设置
  18. python 自动化发送邮件_Python自动化必备发送邮件报告脚本详解
  19. 兄弟连学python(06)装饰器:对类或者函数进行功能的扩展
  20. 使用Sivarc使PLC程序标准化

热门文章

  1. 轩辕传奇服务器维护,轩辕传奇12月17日更新公告_轩辕传奇12月17日部分服务器停服更新公告_牛游戏网...
  2. 银行兴起数字极简风:“智能手机App恐惧症”终于有救了
  3. pytorch深度学习参加平安银行数据大赛,从驾驶行为预测驾驶风险
  4. “2021年度ICT产业龙虎榜”揭晓,九州云喜提“双黄蛋”
  5. XMind使用技巧1
  6. 马来西亚Exabytes商家域名注册过程及可用域名优惠
  7. DSLR Video Tips: Technical Knowledge 数码单反相机视频提示:技术知识 Lynda课程中文字幕
  8. 一个完整的Java项目涉及的技术点有哪些
  9. 亚马逊云科技Build On - Serverless创新零售初体验
  10. 网络工程 网络基础阶段一笔记