Makefile隐含规则

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

隐含规则的含义

隐含规则,就是我们做出一些具体的操作后,系统自动推导完成。

编写 Makefile 的时候,可以使用隐含规则来简化Makefile 文件编写。

下面的例子中没有写重建 test.o 的命令,但是执行 make后,依然重建了 test 和 test.o 文件。这其实就是隐含规则的作用。

test:test.ogcc -o test test.o
test.o:test.c

在某些情况下,不需要给出重建目标文件的命令,甚至不需要给出规则。比如下面代码的运行结果与上面是相同的。

test:test.ogcc -o test test.o

注意:隐含条件只能省略中间目标文件重建的命令和规则,但是最终目标的命令和规则不能省略。

隐含规则的工作流程

make 执行过程中找到的隐含规则,提供了此目标的基本依赖关系,确定了目标的依赖文件和重建目标需要使用的命令行。

但是隐含规则所提供的依赖文件只是一个基本的文件(比如在C语言中对应关系是:test.o 对应 test.c 文件)。当需要增加这个文件的依赖文件时,要在 Makefile 中使用没有命令行的规则给出。比如:

test:test.ogcc -o test test.o
test:test1.h   #这是新加的

隐含规则可能导致的问题

make 有一个的“隐含规则库”,库中的每一条隐含规则都有相应的优先级顺序,优先级也就会越高,使用时也就会被优先使用。

比如 Makefile 中有这行代码:

foo.o:foo.p

我们都知道 .p 文件是 Pascal 程序的源文件,如果书写规则时不加入命令,则 make 会按照隐含的规则来重建目标文件 foo.o。如果当前目录下同时存在 foo.c、foo.p 这两个文件,隐含规则就会把 foo.c 当做是 foo.o 的依赖文件来进行目标文件的重建,而不是把foo.p当做foo.o的依赖文件。这是因为编译 .c 文件的隐含规则在编译 .p 文件之前,优先级比较高。当 make 找到生成 foo.o 的文件之后,就不会再去寻找下一条规则。

这里讲的是预先设置的隐含规则。如果没有明确地写下规则,那么make 就会自己寻找所需要的规则和命令。如果我们不想使用隐含规则,在使用的时候不仅要声明规则的依赖关系,也要添加上执行的命令。当然我们也可以使用 make 的选项-r-n-builtin-rules,来取消所有的预设值的隐含规则。不过对于某些隐含规则,即使指定了“-r”的参数,它们还是会生效的,因为有很多的隐含规则都是使用后缀名的规则来定义的,只要隐含规则中含有“后缀列表”,隐含规则就会生效。默认的列表是:

.out、.a、.in、.o、.c、.cc、.C、.p、.f、.F、.r、.y、.l、.s、.S、.mod、
.sym、.def、.h、.info、.dvi、.tex、.texinfo、.texi、.txinfo、.w、.ch、
.web、.sh、.elc、.el

下面是一些常用编程语言执行隐含规则的顺序,我们在 Makefile 中指定规则时,可以参考这样的列表。当需要编译源文件的时候,首先考虑一下是不是需要使用隐含规则,如果不需要,就要把相应的规则和命令全部书写上去。

  • 编译 C 程序
  • 编译 C++ 程序
  • 编译 Pascal 程序
  • 编译 Fortran/Ratfor 程序
  • 预处理 Fortran/Ratfor 程序
  • 编译 Modula-2 程序
  • 汇编和需要预处理的汇编程序
  • 链接单一的 object 文件
  • Yacc C 程序
  • Lex C 程序时的隐含规则

隐含变量

隐含规则的命令中所使用的变量都是预定义的,我们将这些变量称为“隐含变量”,Makefile 的隐含规则会使用到这些变量。

这些变量允许修改,可以通过命令行参数传递或者设置系统环境变量的方式,对它们进行重新定义。

比如在 Makefile 中编译 .c 文件,如果规则中没有写任何命令,则采用隐含的规则,即默认使用到的编译命令是CC,默认执行的命令是“CC -c”。我们也可以通过命令行参数传递或者设置系统环境变量的方式,将CC重新定义为ncc这样我们编译 .c 文件的时候就可以用ncc进行编译。

隐含规则中使用的变量可以分成两类:

(1)变量代表可执行程序(或者说命令)的名字。例如变量“CC”代表“编译器”这个可执行程序。

(2)变量代表执行某程序(或者说命令)时所使用的参数。例如变量“CFLAGS”。多个参数之间使用空格隔开。

代表可执行程序(或者说命令)的变量列表:

  • AR:函数库打包程序,创建静态库 .a 文档。
  • AS:应用于汇编程序。
  • CC:C 编译程序。
  • CXX:C++编译程序。
  • CO:从 RCS 中提取文件的程序。
  • CPP:C程序的预处理器。
  • FC:编译器和与处理函数 Fortran 源文件的编译器。
  • GET:从CSSC 中提取文件程序。
  • LEX:将Lex语言转变为 C 或 Ratfo 的程序。
  • PC:Pascal 语言编译器。
  • YACC:Yacc 文法分析器(针对于C语言)
  • YACCR:Yacc 文法分析器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WIN7 Wireshark: There are no interfaces on which a capture can be done

有的时候我们在Windows7的环境下使用Wireshark的时候,比如点击【Interface List】的时候,出现错误。 错误内容如下: There are no interfaces on which a capture can be done. 这个错误是因为系统没有启动NPF服务造成的。 解决的办法很简单&…

搭建wordpress开发环境

安装php PHP下载地址:http://windows.php.net/download/ 和MySQL一样,下载包是一个zip压缩包,只需解压缩即可。将它解压缩到 D:\WNMP\php-5.5.6-Win32-VC11-x64目录下: 配置php 将php.ini-production文件复制并重命名为php.ini,并…

GCC和CC的区别

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 参考博客:Difference Between GCC and CC Compiler - Ask Any Difference 参考博客:Linux新手学堂:CC与GCC的区别概括介绍 - Prayer - C博客 总结 1、作用 GCC和CC都是…

Leetcode Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 对于这道题最开始用的是用一个数组存储新建的节点,然后对random的索引时比较快。 后来在…

sharepoint 2007页面显示真实的错误信息

打开下面path的web.config文件:C:\Program Files\Common Files\Microsoft Shared\Web ServerExtensions\12\TEMPLATE\LAYOUTS修改&#xff1a;<system.web>... <customErrors mode"Off" />...</system.web>如果没有就添加&#xff1a;<SharePoi…

Shell循环(for,while,until,break与continue)

以下内容源于C语言中文网的学习与整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、for循环 for循环一般格式为&#xff1a; for 变量 in 列表 docommand1command2...commandN done 列表是一组值&#xff08;数字、字符串等&#xff09;组成的序列&#xff0c;每个值通过…

业界重磅新书《UNIX/Linux网络日志分析与流量监控》首发

《UNIX/Linux网络日志分析与流量监控》出版社官网&#xff1a; http://www.cmpbook.com/stackroom.php?id39384 每本图书附赠51CTO学院的价值100元学习卡一张京东&#xff1a;http://item.jd.com/11582561.html机械工业出版社在线购书平台&#xff1a;http://www.golden-book.…

Git工具使用基础

Git 是一个分布式的版本控制工具&#xff0c;本篇文章从介绍Git开始&#xff0c;重点在于介绍Git的基本命令和使用技巧&#xff0c;让你尝试使用Git的同时&#xff0c;体验到原来一个版 本控制工具可以对开发产生如此之多的影响&#xff0c;文章分为两部分&#xff0c;第一部分…

Shell case esac语句

以下内容源于C语言中文网的学习与整理&#xff0c;如有侵权&#xff0c;请告知删除。 case语句格式 case 值 in 模式1)command1command2command3;; 模式2&#xff09;command1command2command3;; *)command1command2command3;; esac 取值后面是关键字 in。取值可以为变量或常数…

Shell test命令

以下内容源于C语言中文网的学习与整理&#xff0c;如有侵权&#xff0c;请告知删除。 Shell中的 test 命令用于检查某个条件是否成立&#xff0c;它可以进行数值、字符和文件三个方面的测试。这其实相当于一个中括号&#xff1f; 一、数值测试 参数说明-eq等于则为真-ne不等于…

DDOS的攻击原理和防护指南

我们现在来分析DDOS的攻击原理。 首先&#xff0c;DDOS是英文Distributed Denial of Service的缩写&#xff0c;意思是分布式拒绝服务。拒绝服务又是什么意思呢&#xff1f;就是采取一些垃圾数据包来阻塞网站的网络通道&#xff0c;导致让网站不能正常访问。分布式服 务拒绝攻击…

Python基础笔记,后续更新

1,避免‘\n’等特殊字符的两种方式&#xff1a;1&#xff0c;利用转义字符‘\’2&#xff0c;利用原始字符‘r’ print rc:\now3,字符串中嵌入双引号等特殊符号1&#xff0c;利用转义字符‘\’2&#xff0c;使用单引号括起这个字符串 print (i l"o"ve fis.com)2…

.NET:如何让线程支持超时?

背景 本文是为了回复博客园一个兄弟的问题&#xff0c;主要回答两个问题&#xff1a; 如何让线程支持超时&#xff1f;如何让线程在执行结束后销毁&#xff1f;MS 现在不推荐使用低级别的 Thread 编程&#xff0c;而推荐使用 Task&#xff0c;另外我多数情况都是做企业应用&…

第1章 Express MongoDB 搭建多人博客

学习环境 Node.js &#xff1a; 0.10.22 Express &#xff1a; 3.4.4 MongoDB &#xff1a; 2.4.8 快速开始 安装 Express express 是 Node.js 上最流行的 Web 开发框架&#xff0c;正如他的名字一样&#xff0c;使用它我们可以快速的开发一个 Web 应用。我们用 express 来搭…

用UltraISO制作的u盘ubuntu11.04,启动失败解决方案

错误提示&#xff1a;SYSLINUX 3.84 2009-12-18 EBIOS Copyright c 1994-2009 H.Peter Anvin et al 折腾的很久&#xff0c;尝试用Pauly的bootice&#xff0c;结果可以从u盘启动了。 先用UltraISO制作好u盘ubuntu11.04。 下载bootice&#xff0c;把u盘插上去&#xff0c;打开软…

ATT汇编与Intel汇编区别

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 Linux 汇编语言开发指南 Intel 格式&#xff0d;&#xff0d;AT&T 格式_51CTO博客_at&t和intel汇编语法 前言 X86汇编语言有两种语法风格&#xff0c;即Intel汇编风格和AT&T汇编风格。…

Windows Phone 8初学者开发—第7部分:本地化应用程序

Windows Phone 8初学者开发—第7部分&#xff1a;本地化应用程序 原文 Windows Phone 8初学者开发—第7部分&#xff1a;本地化应用程序 第7部分:本地化应用程序 原文地址&#xff1a; http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Pa…

linux shell 上传,下载ftp文件

#####从ftp服务器上的/home/data 到 本地的/home/databackup#####!/bin/bash ftp -n<<! open 192.168.1.171 user guest 123456 binary cd /home/data lcd /home/databackup promptmget *close bye ! 2. ftp自动登录上传文件。 ####本地的/home/databackup to ftp服务器…

ARM官方汇编指令

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 &#xff08;1&#xff09;文档《ARM汇编指令集汇总》 &#xff08;2&#xff09;文档《ARM汇编手册》 &#xff08;3&#xff09;文档《ARM Software Development Toolkit User Guide》 内容总结…

C# 使用printDocument1.Print打印时不显示 正在打印对话框(里面还有一个讨厌的取消按钮)...

C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种&#xff0c;使用PrintController PrintController printController new StandardPrintController(); printDocument1.PrintController printController; printDocument1.Print(); 第二种&am…