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可以作为终极目标的依赖。

  

最新文章

  1. babel 配置探究及错误解析
  2. 手动创建VS单元测试,显示代码覆盖率
  3. Android课程---优化ListView列表视图
  4. js里function的apply vs. bind vs. call
  5. 【BZOJ】【1023】【SHOI2008】cactus仙人掌图
  6. Lucene 3.0
  7. 6、JPA_映射单向多对一的关联关系(n的一方有1的引用,1的一方没有n的集合属性)
  8. 破解win7开机密码,又不取消密码
  9. jar包的一生
  10. mysql 中select for update 锁表的范围备注
  11. Linux的sort命令
  12. android沉浸式状态栏的实现
  13. 利用box-shadow属性实现页面层叠效果
  14. Leetcode 992 Subarrays with K Different Integers
  15. Jquery2--属性相关的操作
  16. Android 底部导航栏的xml
  17. yii2.0 点击验证码图片不刷新
  18. Oozie-自定义实现WorkFlow中shell action
  19. javascript和php使用ajax通信传递JSON
  20. Python 爬验证码

热门文章

  1. loading插件(原创)
  2. Flex Viewer
  3. C# 获得MP4时长
  4. JEPF 3.1.2 发布,我们的软件机床(软件快速开发平台)
  5. cocoapods安装完第三方类库后不生成workspace
  6. XCode模拟器上下黑边、显示不完整、适配问题
  7. C语言中qsort函数的应用
  8. 设计模式 之 观察者(Observer)模式
  9. 关于 python
  10. MySQL分表自增ID解决方案