0.make、makefile是什么?

  makefile定义了一系列的规则,来规定哪些部分先编译,哪些部分后编译,写好makefile以后,只需一个make命令就可以让整个工程完全自动编译,所以简单的说,make&makefile实现了大工程的自动化编译。

1.makefile里是什么?

  看个makefile的简单例子:

 target:main.o test.o
cc -o target main.o teat.o
main.o:main.c x.h
cc -c main.c
test.o:test.c y.h
cc -c test.c
clean:
rm target main.o test.o

  可以看出,makefile中主要由两个部分组成:#1文件依赖关系和#2生成所需命令。其中clean是一个伪目标文件,可用".PHONY:clean"在其前面注明。执行make命令即可编译,执行make clean即可删除所有目标文件。

2.make是如何工作的?

  0)make会在当前目录下找名字为"makefile "或"Makefile"的文件;

  1)若找到makefile文件,接着找第一个目标文件(target),并把它作为最终的目标文件;

  2)若target文件依赖后面的.o文件更新,则执行后面定义的命令会生成target文件;

  3)某个.o文件也会依赖若干个源文件和头文件,它们根据命令生成.o文件。

根据make的依赖性,make会一层层地去找文件的依赖性,直到最终第一个target文件被编译成功。整个过程类似于数据结构中栈的操作。

3.特别注意——makefile中的变量赋值:

  "="是最基本的赋值,makefile会将整个makefile展开后,再决定变量的值。

  ":="是覆盖当前的值,其取决于当前的赋值,而不是最终的赋值(比较好判断)。

  "?="是若没有被赋值过就赋等号后的值。

  "+="是添加等号后的值。

4.可以利用变量减少重复,及利用makefile的自动推导简化makefile,例如:

 #Makefile
objects:main.o test.o
target:$(objects)
cc -o target $(objects)
main.o:x.h #这就用到了自动推导。
test.o:y.h
.PHONY:clean #说明clean是一个伪目标文件。
clean:
rm target $(objects)

  因为这个编译较简单,优势可能不太明显,若要是大工程,变量和自动推导的使用会让makefile有很大的简化。这个部分其实还很丰富,先暂记到这。

5.小注:

0)makefile中命令必须以[tab]键开始。

1)若指定特定的makefile,可用"-f"和"--file"参数。

2)include,被包含的文件会被原封不动的放在当前文件包含的位置,如:

include foo.make

注意,不能以[tab]键开始。
  简单记录了自己的笔记,对于错误和疏漏,欢迎赐教指正。关于make和makefile的更多内容,推荐陈皓的《跟我一起写Makefile》和GNU Makefile手册。

make和makefile简明基础的更多相关文章

  1. MAKEFILE 编程基础之一【转】

    本文转载自:http://www.himigame.com/gcc-makefile/766.html 概述: 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Wind ...

  2. Makefile分析基础

    http://blog.csdn.net/ghostyu/article/details/6866863 在我前一篇写的[ linux驱动学习(一)Makefile基础]中,Makefile写的中规中 ...

  3. 【 MAKEFILE 编程基础之三】详解 MAKEFILE 变量的定义规则使用!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/770.html   ...

  4. 【 MAKEFILE 编程基础之二】MAKEFILE 书写规划以及语法规则!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/768.html   ...

  5. Android makefile编写基础

    首先来看一个简单的Android makefile,这个是我上篇文章写的,重新摘出来: LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_M ...

  6. 【 MAKEFILE 编程基础之四】详解MAKEFILE 函数的语法与使用!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/771.html   ...

  7. 羽夏 MakeFile 简明教程

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.该文章根据 GNU Make Manual 进行汉化处理并作出自己的整理,一是我对 Make 的学习记录,二是对大家学习 MakeF ...

  8. Swift语言 简明基础 代码演示样例

    开发环境: Mac.Xcode6.0 下面内容均可创建ios common line项目来測试 1.Hello World演示样例 使用xcode创建新的common line项目,查看主文件main ...

  9. C Makefile初学基础

    # this is make file hello.out: max.o min.o hello.c gcc max.o min.o hello.c -o hello.out max.o:max.c ...

随机推荐

  1. [bzoj3287] Mato的刷屏计划

    第一眼以为是傻逼斜率优化>_< f[i]表示按i次最多可输出字符数..f[i]=max{ f[i-1]+1,(i-j-1)*f[j] },j<i-2 结果n在100+的时候就喜闻乐见 ...

  2. JXLS 2.4.0系列教程(四)——拾遗 如何做页面小计

    注:阅读本文前,请先阅读第四篇文章. http://www.cnblogs.com/foxlee1024/p/7619845.html 前面写了第四篇教程,发现有些东西忘了讲了,这里补回来. 忘了讲两 ...

  3. 从零开始学习前端开发 — 9、标签嵌套规则及CSS常用样式覆盖

    1. 块级元素可以包含内联元素或某些块级元素,但内联元素却不能包含块级元素,它只能包含其它的内联元素: <div><h1></h1><p></p& ...

  4. WPF 文本滚动效果 渐变效果

    <DockPanel> <StackPanel DockPanel.Dock="Bottom" VerticalAlignment="Bottom&qu ...

  5. SMTP错误码建议解决方法

    https://wenku.baidu.com/view/0af30e01e87101f69e3195b8.html SMTP 错误码 / 建议解决方法 错误总表 101 Cannot Open Co ...

  6. 2018/1/27 每日一学 最长不降序子序列的O(n*logn)算法

    手动维护一个数组模拟即可,233-- 可以使用algorithm中的lower_bound(相当于二分) 代码如下: #include<cstdio> #include<algori ...

  7. [one day one question] Vue数组变更不能触发刷新

    问题描述:Vue数组变更不能触发刷新,特别是数组的每个元素都是对象的时候,对象中某个属性的值发生变化,根本无法触发Vue的dom刷新,这怎么破? 解决方案:this.$set(array, index ...

  8. Windows10下用Anaconda3安装TensorFlow教程

    这是我在自己的笔记本电脑上用Anaconda3安装TensorFlow的教程 1. 安装好Anaconda3版本 (1) 注:可以发现最新版本是Anaconda5了(没关系,下载就是了) (2) 注意 ...

  9. Spring MVC中使用POI导出Word

    内容绝大部分来源于网络 准备工作 准备[XwpfTUtil]工具类(来源于网络) 准备word模版 下载[XwpfTUtil]工具类 import org.apache.poi.xwpf.usermo ...

  10. Linux指令--touch

    原文出处:http://www.cnblogs.com/peida/archive/2012/10/30/2745714.html linux的touch命令不常用,一般在使用make的时候可能会用到 ...