makefile用于定义并描述源文件之间的依赖关系,用于说明如何编译各个源文件并生成最终的可执行文件,规则是makefile中的基本组成部分。

  一个最基本的依赖规则如下所示:
  

  targets代表这个规则的目标,通常是需要生成的目标文件名,或者是make所需执行的命令名称,例如:all。prerequisites代表该规则的依赖,也即当前目标所依赖的其他目标或者文件。command为规则的命令即完成目标所要执行的命令,也叫动作,可以写为图中command1的形式,即和依赖写在同一行,和依赖之间通过分号隔开。也可以写成command2的形式,即写在依赖的下一行,并以tab键开头,tab字符告诉make解释器此行是一个命令行。可以使用续行符“\”将内容分开写到下一行,提高可读性。

  targets可以包含多个目标,使用空格对多个目标名进行分隔。prerequisites也可以包含多个依赖,通过空格对多个依赖进行分隔。

  一个简单的makefile如下:

                            

  上图中,all目标依赖test目标,即需要test的存在,并执行echo "make all"命令才可以完成。而test目标没有依赖,只需要执行echo "make test"即可完成。

  运行make命令,得到下图的结果,可以看到test目标先执行,然后才能执行all目标。小技巧:在命令之前加上@符号,可以不输出命令本身,使命令无回显,而只输出命令执行结果。

                            

  

  一个规则被执行需要满足以下条件中的一个:

  1、当目标对应的文件不存在,执行对应的命令。

  2、当依赖在时间上比依赖更新,执行对应的命令。

  3、当依赖关系连续发生时,对比依赖链上的每一个目标。

  

  另一个makefile案例:

                             

  hello.out需要func.o和main.o文件的存在,并执行对应的命令才能完成。main.o依赖main.c,并执行相应命令才能完成。func.o依赖func.c,并执行相应命令才能完成。执行make后,输出如下所示,可见,只有main.o func.o子目标完成后,才能生成最终的目标hello.out。

                               

  修改func.c,再次执行make,输出如下,main.o没有被重新生成,而只有func.o和hello.out的目标对应的命令被执行了,因为main.o存在,且在时间上比 main.c更新,所以该目标对应的命令不会执行,无需重新生成。

                              

  将hello.out目标改为all,如下所示:

                              

  当我们再次执行make时,gcc -o hello.out main.o func.o,这句命令总会执行,即使依赖文件并没有更新,这是因为在当前目录下并没有一个叫all的文件存在,make在解析makefile时,发现当前路径下没有all文件,而这正符合三个条件中的第一个,因此,命令会被执行。解决技巧如下:

                            

  将hello.out和all目标写在一起,当执行make时,make解释器默认的目标是hello.out,当前目录下会存在hello.out文件,因此,当依赖不改变时,多次执行make命令也不会去更新最终的可执行文件了,而是给出文件是最新的提示,如下所示:

                            

  

欢迎评论、指导以及进一步交流,QQ527635593

本文参考:

    狄泰软件教学课件

    gun make手册

    专业嵌入式软件开发

第二篇 makefile的基本结构的更多相关文章

  1. “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)

    “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构.登录窗口.以及主界面) 一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增 ...

  2. 使用wepy开发微信小程序商城第二篇:路由配置和页面结构

    使用wepy开发微信小程序商城 第二篇:路由配置和页面结构 前言: 最近公司在做一个微信小程序的项目,用的是类似于vue的wepy框架.我也借此机会学习和实践一下. 小程序官方文档:https://d ...

  3. linux-0.11分析:boot文件 setup.s 第二篇随笔

    boot文件 setup.s 第二篇随笔 参考 [github这个博主的][ https://github.com/sunym1993/flash-linux0.11-talk ] 中断获取光标的位置 ...

  4. 《javascript权威指南》读书笔记——第二篇

    <javascript权威指南>读书笔记——第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字 ...

  5. 第二篇.Bootstrap起步

    第二篇Bootstrap起步 我们可以在http://getbootstrap.com下载bootstrap的文件 点击左边的download bootstrap可以下载bootstrap的css,j ...

  6. 【OpenGL】第二篇 Hello OpenGL

    ---------------------------------------------------------------------------------------------------- ...

  7. 解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)

    解剖SQLSERVER 第二篇  对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发Orc ...

  8. 深入理解javascript作用域系列第二篇——词法作用域和动态作用域

    × 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...

  9. [老老实实学WCF] 第二篇 配置WCF

    老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...

随机推荐

  1. Qt数据库_资料

    1. QT笔记_数据库总结(一)-rojian-ChinaUnix博客.html http://blog.chinaunix.net/uid-28194872-id-3631462.html (里面有 ...

  2. set/multiset_01

    按序排列 不能指定插入位置 红黑树变体 不可以直接存取元素(即 无[?]/at(?)操作) 不可以直接修改元素值(用 先删除后添加的方式,达到相同效果) A.头尾 添加/移除 B.随机存取 C.数据存 ...

  3. [库][c++]tinyxml2使用小结

    参考:http://blog.csdn.net/educast/article/details/12908455 1.配置TinyXML2 去这里把项目弄下来,然后解压,我们之需要里面的tinyxml ...

  4. js 几个重要的特性

    背景: 语法借鉴    java 函数借鉴    scheme 原型继承借鉴    self 正则表达式借鉴    Perl 1.动态语言 函数的定义和调用  形参与实参不需要一致 形参可由 argu ...

  5. Python -- Json 数据编码及解析

    Python  --  Json  数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本 ...

  6. Google chrome浏览器打不开网页,显示ERR_Failed...等问题的解决方法

    新装好的win7系统,打开Google浏览器,显示网页可能暂时无法连接,或者它已永久性的移动到了新地址.在网络搜索很多资料,发现解决方法如下,亲测成功. 原因,该服务依赖的TCP/IP 协议有问题. ...

  7. SqlServer使用表值函数汇总

    先谈谈需求,我们先创建一张表,脚本如下: create table Cost ( Id ,) primary key,--编号 CostTime date,--时间 Num int--销售额 ); ' ...

  8. 使用MyBatis Generator自动生成实体、mapper和dao层

    原文链接 通过MyBatis Generator可以自动生成实体.mapper和dao层,记录一下怎么用的. 主要步骤: 关于mybatis从数据库反向生成实体.DAO.mapper: 参考文章:ht ...

  9. inputsimulator - Windows Input Simulator

    窗体输入模拟器提供一个基于 win32 SendInput  方法的 模拟键盘鼠标输入的.net 接口.windows 输入模拟器可用于 WPF.windows 窗体和控制台应用程序, 实现模拟任意按 ...

  10. 20170716xlVba销售明细转销售单据

    Sub CreateSaleList() AppSettings On Error GoTo ErrHandler Dim StartTime As Variant '开始时间 Dim UsedTim ...