第十一部分 隐含规则(二)

这篇具有很好参考价值的文章主要介绍了第十一部分 隐含规则(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、隐含规则使用的变量

1、关于命令的变量。

2、关于命令参数的变量

二、隐含规则链


一、隐含规则使用的变量

        在隐含规则中的命令中,基本上都是使用了一些预先设置的变量。你可以在你的 makefile 中改变这些变量的值,或是在 make 的命令行中传入这些值,或是在你的环境变量 中设置这些值,无论怎么样,只要设置了这些特定的变量,那么其就会对隐含规则起作用。 当然,你也可以利用 make 的“-R”或“--no–builtin-variables”参数来取消你所定义的 变量对隐含规则的作用。

        例如,第一条隐含规则——编译 C 程序的隐含规则的命令是“$(CC) –c $(CFLAGS) $(CPPFLAGS)”。Make 默认的编译命令是“cc”,如果你把变量“$(CC)”重定义成“gcc”, 把变量“$(CFLAGS)”重定义成“-g”,那么,隐含规则中的命令全部会以“gcc –c -g $(CPPFLAGS)”的样子来执行了。

        我们可以把隐含规则中使用的变量分成两种:一种是命令相关的,如“CC”;一种是参 数相的关,如“CFLAGS”。下面是所有隐含规则中会用到的变量:

1、关于命令的变量。

AR

函数库打包程序。默认命令是“ar”。

AS

汇编语言编译程序。默认命令是“as”。

CC

C 语言编译程序。默认命令是“cc”。

CXX

C++语言编译程序。默认命令是“g++”。

CO

从 RCS 文件中扩展文件程序。默认命令是“co”。

CPP

C 程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) –E”。

FC

Fortran 和 Ratfor 的编译器和预处理程序。默认命令是“f77”。

GET

从 SCCS 文件中扩展文件的程序。默认命令是“get”。

LEX

Lex 方法分析器程序(针对于 C 或 Ratfor)。默认命令是“lex”。

PC

Pascal 语言编译程序。默认命令是“pc”。 YACC Yacc 文法分析器(针对于 C 程序)。默认命令是“yacc”。

YACCR

Yacc 文法分析器(针对于 Ratfor 程序)。默认命令是“yacc –r”。

MAKEINFO

转换 Texinfo 源文件(.texi)到 Info 文件程序。默认命令是“makeinfo”。

TEX

从 TeX 源文件创建 TeX DVI 文件的程序。默认命令是“tex”。

TEXI2DVI

从 Texinfo 源文件创建军 TeX DVI 文件的程序。默认命令是“texi2dvi”。

WEAVE

转换 Web 到 TeX 的程序。默认命令是“weave”。

CWEAVE

转换 C Web 到 TeX 的程序。默认命令是“cweave”。

TANGLE

转换 Web 到 Pascal 语言的程序。默认命令是“tangle”。

CTANGLE

转换 C Web 到 C。默认命令是“ctangle”。

RM

删除文件命令。默认命令是“rm –f”。

2、关于命令参数的变量

        下面的这些变量都是相关上面的命令的参数。如果没有指明其默认值,那么其默认值都 是空。

ARFLAGS

函数库打包程序 AR 命令的参数。默认值是“rv”。

ASFLAGS

汇编语言编译器参数。(当明显地调用“.s”或“.S”文件时)。

CFLAGS

C 语言编译器参数。

CXXFLAGS

C++语言编译器参数。

COFLAGS

RCS 命令参数。

CPPFLAGS

C 预处理器参数。( C 和 Fortran 编译器也会用到)。

FFLAGS

Fortran 语言编译器参数。

GFLAGS

SCCS “get”程序参数。

LDFLAGS

链接器参数。(如:“ld”)

LFLAGS

Lex 文法分析器参数。

PFLAGS

Pascal 语言编译器参数。

RFLAGS

Ratfor 程序的 Fortran 编译器参数。

YFLAGS

Yacc 文法分析器参数。

二、隐含规则链

        有些时候,一个目标可能被一系列的隐含规则所作用。例如,一个[.o]的文件生成,可 能会是先被 Yacc 的[.y]文件先成[.c],然后再被 C 的编译器生成。我们把这一系列的隐含 规则叫做“隐含规则链”。

        在上面的例子中,如果文件[.c]存在,那么就直接调用 C 的编译器的隐含规则,如果没 有[.c]文件,但有一个[.y]文件,那么 Yacc 的隐含规则会被调用,生成[.c]文件,然后, 再调用 C 编译的隐含规则最终由[.c]生成[.o]文件,达到目标。

        我们把这种[.c]的文件(或是目标),叫做中间目标。不管怎么样,make 会努力自动推 导生成目标的一切方法,不管中间目标有多少,其都会执着地把所有的隐含规则和你书写的 规则全部合起来分析,努力达到目标,所以,有些时候,可能会让你觉得奇怪,怎么我的目 标会这样生成?怎么我的 makefile 发疯了?

        在默认情况下,对于中间目标,它和一般的目标有两个地方所不同:第一个不同是除非 中间的目标不存在,才会引发中间规则。第二个不同的是,只要目标成功产生,那么,产生 最终目标过程中,所产生的中间目标文件会被以“rm -f”删除。

         通常,一个被 makefile 指定成目标或是依赖目标的文件不能被当作中介。然而,你可 以明显地说明一个文件或是目标是中介目标,你可以使用伪目标“.INTERMEDIATE”来强制 声明。(如:.INTERMEDIATE : mid )

         你也可以阻止 make 自动删除中间目标,要做到这一点,你可以使用伪目标 “.SECONDARY”来强制声明(如:.SECONDARY : sec)。你还可以把你的目标,以模式的方 式来指定(如:%.o)成伪目标“.PRECIOUS”的依赖目标,以保存被隐含规则所生成的中间 文件。

         在“隐含规则链”中,禁止同一个目标出现两次或两次以上,这样一来,就可防止在 make 自动推导时出现无限递归的情况。

        Make 会优化一些特殊的隐含规则,而不生成中间文件。如,从文件“foo.c”生成目标 程序“foo”,按道理,make 会编译生成中间文件“foo.o”,然后链接成“foo”,但在实 际情况下,这一动作可以被一条“cc”的命令完成(cc –o foo foo.c),于是优化过的规 则就不会生成中间文件。文章来源地址https://www.toymoban.com/news/detail-797400.html

到了这里,关于第十一部分 隐含规则(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jenkins汉化一部分问题(一半中文一半英文)解决

    安装中文插件“Locale plugin”和“Localization: Chinese (Simplified)后,先设置为zh_US重新启动,再设置回来 其他插件重启Jenkins后,又出现了部分中文简体不翻译的情况。 方法如下,可以临时完美修复。 1. 将语言设定为zh_US,Jenkins切换为英文。 2. 调用restart重启Jenkins:http://jenkisn网址

    2024年02月11日
    浏览(65)
  • 第三十一部分:大模型在搜索引擎领域

    在过去的几年里,搜索引擎技术发展迅速,从简单的查询到智能的语义搜索和知识图谱。随着大模型在自然语言处理(NLP)和计算机视觉等领域的成功应用,搜索引擎也开始逐渐引入大模型技术,以提高搜索质量和用户体验。本文将从大模型在搜索引擎领域的背景、核心

    2024年02月20日
    浏览(51)
  • Echarts使用中遇到图表只显示一部分的情况

            在引用完Echarts后,发现图只显示了一小部分,检查布局也没有任何问题,然后通过控制台 检查,无论怎么去调它所在容器的宽高都没有任何的变化,调canves的宽高也只有拉伸的效果。          出现这种现象的原因是:Echarts的依赖是惰性的,需要手动设置r

    2024年02月11日
    浏览(42)
  • [云原生] 二进制安装K8S一部分

    目前Kubernetes最新版本是v1.25,但大部分公司一般不会使用最新版本。 目前公司使用比较多的:老版本是v1.15,因为v1.16改变了很多API接口版本,国内目前使用比较多的是v1.18、v1.20。  组件部署: mater节点 mater01 192.168.136.100 kube-apiserver kube-controller-manager kube-scheduler etcd        

    2024年02月22日
    浏览(39)
  • Git合并固定分支的某一部分至当前分支

    在 Git 中,通常使用 git merge 命令来将一个分支的更改合并到另一个分支。如果你只想合并某个分支的一部分代码,可以使用以下两种方法: 首先,从要合并的源分支(即要提取代码的分支)中创建并切换到一个新的临时分支。这样可以在该分支上进行修改,以便选择性地合

    2024年02月21日
    浏览(64)
  • RV1126与RV1109 AI系统设计概要(一部分)

            四核核 Cortex-A7,ARM架构V7-A指令,独立Neon SIMD(一种高级单指令多数据扩展指令集,可执行并行数据处理),与独立FPU(浮点计算)。 (RV1109双核A7)         每核有32KB L1 I-Cache(一级指令高速缓存),32KB L1 D-Cache(一级数据高速缓存)         512KB L2 Cache(二极

    2024年02月07日
    浏览(45)
  • AD18批量修改一部分或者全部器件位号的方法!

           现在任何一个公司嵌入式硬件开发的主板全都是有很多sheet的,而硬件工程师做的往往也都是在老的图纸上进行修改或者再设计,也正因为如此,我们在画原理图的时候尽量不要去改动已有部分的位号,以免PCB工程师骂人! 就算自己画PCB的时候也会晕头转向!      

    2024年01月17日
    浏览(34)
  • 过去一周写过的算法题的一部分(dfs,贪心)

    (首先说明一点哈:这是我第一次写博客,写的不好大家见谅) 自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解,谢谢啦 (题目链接:P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)) 我一开始用

    2024年02月03日
    浏览(30)
  • 孙宇晨最新研判:加密货币将成为全球金融基础设施的一部分

    近日,波场TRON创始人、火币HTX全球顾问委员会委员孙宇晨接受了在加密社区有重要影响力的媒体平台Bankless的专访,就自己的从业经历、涉足加密行业的理想、波场TRON本身的发展和未来的市场走向等话题进行了详细的分享。 孙宇晨认为,波场TRON的使命是为那些没有银行账户的人

    2024年03月21日
    浏览(45)
  • AR”将会成为“更加日常化的移动设备应用的一部分”吗

    目录 1:AR是什么 2:AR给人类带来的贡献 3:人们在生活中可以遇到许多 AR 技术应用 4:AR 技术的未来发展的趋势:      大学主攻VR,从大一就对VR的知识,设备,已经所涉及的知识伴随我的整个大学时光,今天,我就大家聊聊VR的同胞兄弟AR AR 是增强现实 (Augmented Reality) 的缩

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包