Makefile简介

  在执行make之前需要一个命名为Makefile的特殊文件来告诉make需要做些什么。

  当使用 make 工具进行编译时,工程中以下几种文件在执行 make 时将会被编译 (重新编译):

    1. 所有的源文件没有被编译过,则对各个 C 源文件进行编译并进行链接,生成最后的可执行程序;

    2. 每一个在上次执行 make 之后修改过的 C 源代码文件在本次执行 make 时将会被重新编译;

    3. 头文件在上一次执行 make 之后被修改。则所有包含此头文件的 C 源文件在本次执行 make 时将会被重新编译。

  后两种情况是make只将修改过的C源文件重新编译生成.o文件,对于没有修改的文件不进行任何工作。

Makefile规则介绍

一个简单的Makefile描述规则组成:     

TARGET : PREREQUISITES
  COMMAND
  ...
  ...

  TARGET: 规则的目标。通常是最后需要生成的文件名或者为了实现这个目的而必需的中间过程文件名。

  PREREQUISITES:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依赖于一个或多个文件。

  command: 规则的命令行。以[tab]键开头。直接交给系统的shell执行。

  换行是以( \ )来分解的。

  默认情况下,Makefile中的第一个规则为最终目标或终极目标。

  对于.o文件作为目标的规则处理有下列三种情况:

    1. 目标.o 文件不存在,使用其描述规则创建它;

    2. 目标.o 文件存在,目标.o 文件所依赖的.c 源文件、.h 文件中的任何一个比目标.o文件“更新”(在上一次 make 之后被修改)。则根据规则重新编译生成它;

    3. 目标.o 文件存在,目标.o 文件比它的任何一个依赖文件(的.c 源文件、 .h 文件)“更新”(它的依赖文件在上一次 make 之后没有被修改),则什么也不做。

  对于终极目标,其处理方式和.o文件类似。

指定变量

由于规则的目标和依赖通常有比较多的文件,我们可以用变量进行定义,来方便我们修改。  

objects = main.o
$(objects)    //这样来使用变量

自动推导规则

  在使用make编译.c源文件时,编译.c源文件的规则命令可以不用明确给出。

  这是因为make本身有一个默认规则,能够自动完成对.c文件的编译并产生对应的.o文件。

  它执行命令“cc -c”来编译。

  书写规则建议的方式是:单目标,多依赖。就是说尽量要做到一个规则中只存在一个目标文件,可有多个依赖文件。 尽量避免使用多目标,单依赖的方式。

清除工作目录过程文件  

.PHONY:clean
clean:
  -rm *.o

    这两个实现和普通的有两点不同:

    1. 通过“ .PHONY”特殊目标将“ clean”目标声明为伪目标。避免当磁盘上存在一个名为“ clean”文件时,目标“ clean”所在规则的命令无法执行。

     2. 在命令行之前使用“ -”,意思是忽略命令“ rm”的执行错误。

  这样的一个目标不能将其作为终极目标。

  clean可以作为终极目标的依赖。

  

GNU make简要介绍①指定变量、自动推导规则、清除工作目录过程文件的更多相关文章

  1. ShellExecuteA加载exe文件指定工作目录找不到文件的问题

    使用ShellExecuteA调用exe文件时,指定工作目录需要注意 函数原型为: HINSTANCE ShellExecuteA( HWND hwnd, LPCTSTR lpOperation, L ...

  2. 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序

    很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...

  3. Android编译系统简要介绍【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/18466779 在Android源码环境中,我们开发好一个模块后,再写一个Androi ...

  4. 0-Broadcast机制原理简要介绍

    Broadcast机制简要介绍 来源: http://blog.csdn.net/luoshengyang/article/details/6730748 导语 广播机制在Android系统中,也不算 ...

  5. Dalvik虚拟机简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...

  6. Android应用程序窗口(Activity)实现框架简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8170307 前面我们学习了SurfaceFli ...

  7. ElasticSearch API 简要介绍

    调用其API会返回很多信息,例如集群的信息,节点的信息等 检查集群的状态----Restful API说明 1:检查集群状态信息 2:管理集群 3:执行 增删改查 命令 4:执行高级命令 Restfu ...

  8. HTTP协议简要介绍

    1. 网络基础 TCP/IP 通常使用的网络是在TCP/IP协议簇基础上运作的. HTTP属于它内部的一个子集. TCP/IP分为4个层次, 应用层, 传输层, 网络层, 链路层. (Applicat ...

  9. Windows ToolTips简要介绍(转)

    原文转自 https://blog.csdn.net/sesiria/article/details/77450151 Windows 标准控件ToolTips简要介绍 参考文档 MSDN https ...

随机推荐

  1. 学习zepto.js(Hello World)

    Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api. 如果你会用jquery,那么你也会用zepto. 昨天听说了zepto.js,正好最近也比较闲 ...

  2. HTML标签的嵌套

    随着时间的推移,我们学习html的基础知识有了大概的了解.而我发现,平时在写html文档的时候,发现不太清楚标签之间的嵌套规则,经常是想到什么标签就用那些,然而发现有时的标签嵌套却是错误的.通过网上找 ...

  3. ArcSDE安装注意事项

    今天因为测试需要配置环境,因此在本机上安装了ArcSDE 9.3 for Oracle11g,但是发现安装完之后服务(esri_sde)出现了启动后又立马停止的问题,解决方法如下: 1)检查Oracl ...

  4. DirectX HLSL相关基础

    DirectX HLSL相关 顶点着色器可用软件顶点运算方式来模拟,即在创建设备时,将设备行为标记设定为: D3DCREATE_SOFTWARE_VERTEXPROCESSING 在记事本中编写着色器 ...

  5. Android 沉浸式状态栏 实现方式一

    1.开源项目 https://github.com/jgilfelt/SystemBarTint

  6. Android 手机卫士--xutils说明与下载方法使用

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词) ...

  7. 优化MySchool数据库(存储过程)

    什么是“存储过程”: ---- 数据库中,用于存储“业务逻辑”的技术!(T-SQL代码当做数据一样保存到数据可) 语法 : [if exists(select * from sysobjects wh ...

  8. (转)postman中 form-data、x-www-form-urlencoded、raw、binary的区别

    1.form-data:  就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件 ...

  9. android环境搭建

    Android开发环境的两种安装方式:JDK+Eclipse+ADT直接下载集成的开发工具,解压即可用.下载地址:http://pan.baidu.com/s/1dD3s3bN ,不管采用哪种安装方式 ...

  10. iOS带动画的环形进度条(进度条和数字同步)

    本篇写的是实现环形进度条,并带动画效果,要实现这些,仅能通过自己画一个 方法直接看代码 为了方便多次调用,用继承UIView的方式 .m文件 #import <UIKit/UIKit.h> ...