By francis_hao    Mar 2,2017

makefile

makefile一个很简单的例子如下,该实例完成在执行make时,将main.c编译成可执行文件main的功能。

各项的含义:

main

目标

main.c

目标的依赖文件

:

目标与依赖的分隔符

gcc -o main main.c

命令(一般是shell命令),必须以TAB开头

 

make工作过程

在默认的情况下,输入make命令时,

  1. make在当前目录下按顺序读取GNUmakefile、makefile和Makefile。
  2. 若找到文件则再读取第一个目标,并只将此目标当作最终目标。
  3. 查看其后的依赖,若依赖存在且未改动过则退出,若依赖不存在则查看之后的目标是否含有此依赖,层层嵌套。依赖若均存在,执行之后的命令。

当然,可以在make之后指定目标,那么make则会直接去读取该指定的目标,下图展示该过程:

此例的makefile中有两个目标:first和second。

只执行make时,make只读取第一个目标first,此目标生成后,其后的目标second不会被处理,但是在make后指定目标second,则会只生成此目标。

 

伪目标

如果,想要删除上面的makefile生成的目标文件first和second。该怎么办呢?

答案是写一个不需要依赖的目标(比如clean),只用它执行删除命令。

看似很完美的解决了,但是如果很不巧当前文件夹下也有一个和此目标同名的文件(clean),那么这个目标就总是最新的(因为后面没有依赖),每次都不会执行。如下所示

解决的办法就是告诉make这个目标是个伪目标,需要每次都执行。告诉make的方法就是用.PHONY标志此目标,如下

.PHONY的位置无关紧要,放在最下面也是可以的。

 

注释

makefile里只有行注释,以#开头的行是注释行。若要使用#,可以使用转义字符\#。

 

结语

makefile的东西其实就这么多,因此这篇文档也就结束了。

 

 


本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/6493018.html

 

参考

【1】 跟我一起写Makefile 陈皓 http://blog.csdn.net/haoel/article/details/2886/

makefile使用笔记(一)入门的更多相关文章

  1. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  2. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  3. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  4. <转>Windows平台下Makefile学习笔记(二)

    本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...

  5. Java学习笔记之---入门

    Java学习笔记之---入门 一. 为什么要在众多的编程语言中选择Java? java是一种纯面向对象的编程语言 java学习起来比较简单,适合初学者使用 java可以跨平台,即在Windows操作系 ...

  6. Bootstrap笔记--快速入门

    首先是Bootstrap的简介: 业余了解:下面这个网址可以查询IP地址的地理位置 下面学习:(具体可以参考Bootstrap中文网) 栅格系统 Bootstrap 提供了一套响应式.移动设备优先的流 ...

  7. DBFlow框架的学习笔记之入门

    什么是DBFlow? dbflow是一款android高性的ORM数据库.可以使用在进行项目中有关数据库的操作.github下载源码 1.环境配置 先导入 apt plugin库到你的classpat ...

  8. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  9. [学习笔记]SiftGPU入门

    当有读者看到我这篇SiftGPU入门的学习笔记时,相信你已经读过了高博那篇<SLAM拾萃:SiftGPU>,那篇文章写于16年,已经过去两年的时间.在我尝试配置SiftGPU的环境时,遇到 ...

随机推荐

  1. json模块、os模块

    一.eval模拟序列化操作 1.序列化 内存中的数据-------->转成一种中间格式(字符串)---------->存到文件中 dic={'name':'egon','age':18} ...

  2. C++ vector的reserve和resize详解

    vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size!原因如下:      rese ...

  3. abap<itab>refresh,clear,free

    在ABAP开发过程中,clear,refresh,free都有用来清空内表的作用,但用法还是有区别的. clear itab,清空内表行以及工作区,但保存内存区. clear itab[],清空内表行 ...

  4. Android面试收集录 电话、短信和联系人、多媒体技术

    1.请写出调用系统拨号界面? Intent intent=new Intent(Intent.ACTION_DIAL,Uri.pase("tel:12345678910")); s ...

  5. Gradle 设置本地meaven

    repositories { maven { url uri("F:\\meaven")} }

  6. Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录 1.二级缓存的具 ...

  7. 实用脚本 2 -- Linux下定时执行脚本

    今天学习Linux下定时执行脚本,看到一篇讲解比较好的文章,特此拿来分享. 原文链接:http://www.blogjava.net/decode360/archive/2009/09/18/2877 ...

  8. mac 下 安装php扩展 - mcrypt

    由于自带的libmcrypt 可能版本低 另外通过brew安装的也不管用得去下载libmcrypt后编译安装 tar zxvf libmcrypt-2.5.8.tar.gz cd libmcrypt- ...

  9. Question | 关于Android安全的一二事

    本文来自网易云社区 "Question"为网易云易盾的问答栏目,将会解答和呈现安全领域大家常见的问题和困惑.如果你有什么疑惑,也欢迎通过邮件(zhangyong02@corp.ne ...

  10. 算法搬运之BFPRT算法

    原文连接:http://noalgo.info/466.html BFPRT算法,又称为中位数的中位数算法,由5位大牛(Blum . Floyd . Pratt . Rivest . Tarjan)提 ...