一、Makefile 作用

Make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和链接程序。make 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。我们的规则是:

1)如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。

2)如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目标程。

3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,并链接目标程序。


Makefile的核心和主线规范如下
------------------------------------------------
target ... : prerequisites ...command
...或者targets : prerequisites ; commandcommand
...
------------------------------------------------
PS:target 目标文件依赖于prerequisites 中的文件,其生成规则定义在 command 中.
(1)target 是一个目标文件,可以是 中间代码文件、执行文件,还可以是一个标签(Label)。
(2)prerequisites 就是要生成那个 target 所需要的文件。
(3)command 也就是 make 需要执行的命令,任意的 Shell 命令。
(4)如果mommand命令,于prerequisites不在一行,那command必须要以[Tab]键开始,
如果和 prerequisites 在一行,那么可以用分号做为分隔。

二、例子

比如我们的工程有 8 个 C 文件和 3 个头文件,我们要写一个 Makefile 来告诉 Make 命令如何编译和链接这几个文件。

edit : main.o kbd.o command.o display.o \insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.c
kbd.o : kbd.c defs.h command.hcc -c kbd.c
command.o : command.c defs.h command.hcc -c command.c
display.o : display.c defs.h buffer.hcc -c display.c
insert.o : insert.c defs.h buffer.hcc -c insert.c
search.o : search.c defs.h buffer.hcc -c search.c
files.o : files.c defs.h buffer.h command.hcc -c files.c
utils.o : utils.c defs.hcc -c utils.c
clean :rm edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.o

(1)反斜杠(\)是换行符的意思。

(2)我们把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make” 就可以生成执行文件 edit。

(3)在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要 以一个 Tab 键作为开头。记住,make 并不管命令是怎么工作的,他只管执行所定义的命令。 make 会比较 targets 文件和 prerequisites 文件的修改日期,如果 prerequisites 文件的 日期要比 targets 文件的日期要新,或者 target 不存在的话,那么,make 就会执行后续定义的命令。

(4)如果要删除执行文件和所有的中间目标文件,那么,只要简单 地执行一下“make clean”就可以了。clean 不是一个文件,它只不过是一个动作名字,我们可以在一个 makefile 中定义不用的编译或是和 编译无关的命令,比如程序的打包,程序的备份,等等。

(5)gcc参数含义

-g 可执行程序包含调试信息
-o 指定输出文件名
-c 只编译不链接

三、Make如何工作

1、make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。

2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到 “edit”这个文件,并把这个文件作为最终的目标文件。

3、如果 edit 文件不存在,或是 edit 所依赖的后面的 .o 文件的文件修改时间要比 edit 这个文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。

4、如果 edit 所依赖的.o 文件也存在,那么 make 会在当前文件中找目标为.o 文件的依 赖性,如果找到则再根据那一个规则生成.o 文件。(这有点像一个堆栈的过程)

5、当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 .o 文件,然后再用 .o 文 件生命 make 的终极任务,也就是执行文件 edit 了。

四、Makefile 里有什么?

Makefile 里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

1、显式规则

显式规则说明了,如何生成一个或多的的目标文件。这是由 Makefile 的书写者明显指 出,要生成的文件,文件的依赖文件,生成的命令。

2、隐晦规则

由于我们的 make 有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书 写 Makefile,这是由 make 所支持的。

3、变量的定义

在 Makefile 中我们要定义一系列的变量,变量一般都是字符串,这个有点你 C 语言中 的宏,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。

4、文件指示

(1)在一个 Makefile 中引用另一个 Makefile,就像 C 语言中的 include 一样;

(2)根据某些情况指定 Makefile 中的有效部分,就像 C 语言中的预 编译#if 一样;

(3)定义一个多行的命令。(后续讲)

5、注释

Makefile 中只有行注释,和 UNIX 的 Shell 脚本一样,其注释是用“#”字符,这个就像 C/C++中的“//”一样。如果你要在你的 Makefile 中使用“#”字符,可以用反斜框进行转义,如:“\#”。

五、Makefile文件名

建议命名成“Makefile”,首字母大写。

当 然 , 你 可 以 使 用 别 的 文 件 名 来 书 写 Makefile , 比 如 : “Make.Linux” , “Make.Solaris”,“Make.AIX”等,如果要指定特定的 Makefile,你可以使用 make 的 “-f”和“--file”参数,如:make -f Make.Linux 或 make --file Make.AIX。

Makefile_03:Makefile介绍(作用、例子、原理)相关推荐

  1. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  2. Makefile介绍

    Makefile 值得一提的是,在Makefile中的命令,必须要以[Tab]键开始. 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了 ...

  3. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  4. python super()方法的作用_详解python的super()的作用和原理

    Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递.uz0免费资源网 今天我们介绍的主角是s ...

  5. Java之String系列--intern方法的作用及原理

    原文网址:Java之String系列--intern方法的作用及原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的String的intern方法的原理. 常量池简介 在 JAVA 语言中 ...

  6. Makefile文件:Makefile介绍

    本文介绍Makefile的一些基本概念以及简单的用法.本文所用的编译器是Hightec tricore v4.9.1.0. 文章目录 1 Makefile的作用 2 Makefile的规则 3 一个简 ...

  7. Batch Normalization的作用及原理

    目录 声明 BN是什么[1] 为什么提出BN[1, 2] BN的作用及原理 加速训练,提高收敛速度[1] 缓解梯度消失(梯度爆炸)[3] 缓解过拟合[4] 其他相关问题 BN和激活函数的顺序问题[5] ...

  8. 电路中滤波电容和退耦电容_关于滤波电容、去耦电容、旁路电容作用及其原理...

    关于滤波电容.去耦电容.旁路电容作用及其原理 从电路来说,总是存在驱动的源和被驱动的负载.如果负载电容比较大,驱动电路要把电容充电.放电,才能完成信号的跳变,在上升沿比较陡峭的时候,电流比较大,这样驱 ...

  9. 三极管的介绍及工作原理

    转载自[http://www.elecfans.com/yuanqijian/sanjiguang/20170425510870.html] 三极管的介绍及工作原理 三极管介绍 三极管的工作原理 一. ...

  10. 【Vue】基础(三)条件渲染 - 列表渲染(key的作用与原理虚拟DOM解析) - 收集表单数据 - 持续更新中

    目录 11. 条件渲染 11.1 v-if 11.2 v-show 12. 列表渲染 12.1 v-for(基本列表使用) 12.2 key的作用与原理 真实DOM和其解析流程 虚拟 DOM 的好处 ...

最新文章

  1. ubuntu下安装eclipse
  2. 使用OKHttp3实现下载(断点续传、显示进度)
  3. 数据库事务隔离级别(转)
  4. LVS+Keepalive 实现负载均衡高可用集群
  5. Android PopupWindow 隐藏软键盘的方法
  6. java api 1.6 下载_Java JDK API
  7. WindowsXP命令行修改服务启动选项
  8. 蓝牙打印和网口打印的实现
  9. 互联网日报 | 5月4日 星期二 | 水滴公司启动上市路演;蔚来汽车累计交付量突破10万里程碑;巴菲特透露接班人选
  10. 三月磨一剑---也来晒晒我们的开发产品 欢迎拍砖
  11. [K/3Cloud]创建一个操作校验器
  12. 科学计算机计算内插法,线性插值计算器
  13. vant area地区选择组件使用方法
  14. 个人总结的新手看房买房注意事项,有遗漏的地方请各位同学帮忙补充
  15. sketch插件 android,Sketch 插件大集合
  16. MySQL索引、事务与引擎基础详解,理论加实例
  17. jrtplib学习目录及总结
  18. 如何将逻辑地址转换成物理地址
  19. Python中字典的应用及相关操作!
  20. ad中按钮开关的符号_电工最常用电气元件实物图及对应符号

热门文章

  1. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)
  2. android中Invalidate和postInvalidate的区别
  3. UOJ42/BZOJ3817 清华集训2014 Sum 类欧几里得
  4. 批量镜像locator(比如表情模板)
  5. 【转】HTTP Response Header 的 Content-Disposition
  6. 触摸事件练习 -- 手势解锁
  7. 分页数据的新展示方式---瀑布流
  8. [算法学习] 线段树,树状数组,数堆,笛卡尔树
  9. Linux中makefile项目管理
  10. 旋转矩阵、欧拉角、四元数、轴/角之间的转换