2019独角兽企业重金招聘Python工程师标准>>>

Makefile 编辑一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

所要完成的Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的唯一的一件事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。

make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。 在 UNIX 系统中,习惯使用 Makefile 作为 makefile 文件。如果要使用其他文件作为 makefile,则可利用类似下面的 make 命令选项指定 makefile 文件:

$ make -f Makefile.debug _例如,一个名为prog的程序由三个C源文件filea.c、fileb.c和filec.c以及库文件LS编译生成,这三个文件还分别包含自己的头文件a.h 、b.h和c.h。通常情况下,C编译器将会输出三个目标文件filea.o、fileb.o和filec.o。假设filea.c和fileb.c都要声明用到一个名为defs的文件,但filec.c不用。即在filea.c和fileb.c里都有这样的声明: #include "defs" 那么下面的文档就描述了这些文件之间的相互联系:

0 #It is a example for describing makefile 注释行

1 prog : filea.o fileb.o filec.o #指定prog由三个目标文件filea.o、fileb.o和filec.o链接生成

2 cc filea.o fileb.o filec.o -LS -o prog #如何从prog所依赖的文件建立可执行文件

3 filea.o : filea.c a.h defs #指定filea.o目标文件,以及它们所依赖的.c和.h文件以及defs文件

4 cc -c filea.c #如何从目标所依赖的文件建立目标,即如何从filea.c建立filea.o

5 fileb.o : fileb.c b.h defs #指定fileb.o目标文件,以及它们所依赖的.c和.h文件以及defs文件

6 cc -c fileb.c #如何从目标所依赖的文件建立目标,即如何从fileb.c建立fileb.o

7 filec.o : filec.c c.h #指定filec.o目标文件,以及它们所依赖的.c和.h文件

8 cc -c filec.c #如何从目标所依赖的文件建立目标,即如何从filec.c建立filec.o

这个描述文档就是一个简单的makefile文件,采用深度优先的原则执行编译命令。我们针对上例的代码方面进行一些基础性说明:CC 是一个全局变量,它指定你的Makefile所用的编译器,一般默认是gcc;.o文件是unix下的中间代码目标文件,就如同在windows下的.obj文件一样,在unix下生成.o文件的过程叫编译(compile),将无数.o文件集合生成可执行文件的过程叫链接(link);有时会在unix界面下看到.a文件,那是Archive File,相当于windows下的库文件Library File,.a文件作用是:由于源文件太多(上例是指.c和.h文件过多),编译生成的中间目标文件(.o文件)太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,这个包就是.a文件。

当filea.c或a.h文件在编译之后又被修改,则 make 工具可自动重新编译filea.o,如果在前后两次编译之间,filea.c 和a.h 均没有被修改,而且filea.o还存在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义,make 工具可避免许多不必要的编译工作。当然,利用Shell脚本也可以达到自动编译的效果,但是,Shell 脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件,而 make 工具则可根据目标上一次编译的时间和目标所依赖的源文件的更新时间而自动判断应当编译哪个源文件。_

让我们先来粗略地看一看Makefile的规则。[3] target ... : prerequisites ... command ... ... 目标:依赖 执行指令 ... target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。 ① prerequisites就是,要生成那个target所需要的文件或是目标。 ② command也就是make需要执行的命令。(任意的Shell命令) 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行(command一定要以Tab键开始,否则编译器无法识别command),减少重复编译,提高了其软件工程管理效率。

Makefile中允许使用简单的宏指代源文件及其相关编译信息,在Linux中也称宏为变量。在引用宏时只需在变量前加$符号,但值得注意的是,如果变量名的长度超过一个字符,在引用时就必须加圆括号()。 有效的宏引用 $(CFLAGS) $Z $(Z) 其中最后两个引用是完全一致的。 需要注意的是一些宏的预定义变量,在Unix系统中,$*、$@、$?和$<四个特殊宏的值在执行命令的过程中会发生相应的变化,而在GNU make中则定义了更多的预定义变量。关于预定义变量的详细内容,宏定义的使用可以使我们脱离那些冗长乏味的编译选项,为编写makefile文件带来很大的方便。

GNU make 的主要预定义变量 预定义变量 含义 $* 不包含扩展名的目标文件名称。 $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。 $< 第一个依赖文件的名称。 $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。 $@ 目标的完整名称。 $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。 $% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 (image.o),则 $@ 为 ,而 $% 为 image.o。 AR 归档维护程序的名称,默认值为 ar。 ARFLAGS 归档维护程序的选项。 AS 汇编程序的名称,默认值为 as。 ASFLAGS 汇编程序的选项。 CC C编译器的名称,默认值为 cc。 CFLAGS C编译器的选项。 CPP C 预编译器的名称,默认值为 $(CC) -E。 CPPFLAGS C预编译的选项。 CXX C++编译器的名称,默认值为 g++。 CXXFLAGS C++编译器的选项。 FC FORTRAN编译器的名称,默认值为 f77。 FFLAGS FORTRAN编译器的选项。 Makefile以文件名:文件名的形式比较冒号右边的文件是不是较左边的文件有更新,如果有更新则执行下一行的程序代码。因此Makefile可以把文件关联起来

转载于:https://my.oschina.net/leonardtang/blog/761922

解析Makefile文件的构建规则相关推荐

  1. Makefile文件的编写规则

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...

  2. makefile文件的书写规则(make和makefile)

    对于makefile,掌握一个规则,两个变量和三个函数.下面介绍一个规则. makefile的作用:一个项目代码的管理工具.当一个项目的代码文件数(如.c文件)太多,用gcc编译会太麻烦,如果全部文件 ...

  3. 构建makefile文件

    makefile文件入门 makefile文件的组成内容 makefile 文件主要有一下5种组成部分 显示规则:显示规则说明了生成一个或多个目标文件的发改发和步骤. 隐式规则:由于make工具有自动 ...

  4. Makefile文件的简单编写

    参考: MakeFile文件是什么--内容.工作原理.作用.使用 嵌入式操作系统linux篇(书) Makefile伪目标 GNU make中文手册.pdf   在嵌入式开发中,一个工程中的源文件是非 ...

  5. Linux编程——入门级Makefile文件编写

    前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...

  6. Linux——Makefile文件

    Makefile/makefile Windows环境下IDE会自动帮你完成makefile文件的编写,Linux上我们需要自己编写. Makefile文件,我们可以将其理解为一个工程文件的编译规则, ...

  7. 认识Makefile文件(什么作用,格式怎样,如何工作)

    以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除. 参考博客:Make 命令教程 - 阮一峰的网络日志 一.Makefile文件是什么 Makefile 文件描述了 Linux 系统下 ...

  8. Makefile文件的编写

    文章目录 前言 第一个最简单的 Makefile 文件举例 第二个Makefile示例 第三个Makefile示例 第四个Makefile示例 第五个Makefile示例 总结 前言 Makefile ...

  9. Android makefile文件解析

    Android makefile文件解析 Android编译过程详解 编译步骤 Android的编译步骤包括三步: 1.通过source build/envsetup.sh命令将sh文件中的命令加载到 ...

最新文章

  1. C 语言编程 — 宏定义与预处理器指令
  2. macappstore登不上去_荣耀亲选一度登机箱----一个安静得想放进大侄子的magic box
  3. [InnoDB系列] -- SHOW INNODB STATUS 探秘
  4. XGBoost缺失值引发的问题及其深度分析
  5. node-serialport —— Node.js 串口数据读写包
  6. python编写性别比例_Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】...
  7. [XSY3382] 专家系统(二分+线段树)
  8. SpringMVC获取response的问题
  9. 复练-面试的科技树-我是谁、我喜欢、我能够
  10. java colormodel_ColorModel
  11. 【Python配置】Win10配置Python3、Numpy、PyCharm、Anaconda
  12. Accurate, Large Minibatch SGD
  13. Java二级多少分算过_计算机二级考多少分算过
  14. 【JavaWeb】网络留言板 可登录、注册、留言、修改留言、删除留言 附源码
  15. fiddler应用--保存下载的数据--以奇书网下载小说为例
  16. C#实现发送短信到手机
  17. android 获得ram大小,Android中获取(RAM)总运存大小跟可用运存大小
  18. python自动求梯度
  19. Gmail和Orkut邀请自助发送[共享]
  20. ABRT 已检测到 ‘1‘ 个问题。预了解详细信息请执行:abrt-cli list --since 1641347561

热门文章

  1. 「NLP」用于序列标注问题的条件随机场
  2. 谷歌将AutoML应用于Transformer架构,翻译结果飙升,已开源
  3. SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了?
  4. 如何“快”、“准”、“狠”成为优秀算法工程师
  5. 刚刚,我国智能科学技术最高奖揭晓!
  6. 近亿台物联网设备或遭劫持,这家IoT云平台遭遇“灾难性”入侵事件
  7. EUV光刻机全球出货量达57台
  8. 脑机接口技术重大突破!首次帮助瘫痪男子恢复运动和触觉
  9. 2019-2021年中国AI芯片市场预测与展望数据
  10. 崛起的超级智能:是否会是下一个“麦克卢汉式”预言?