LinuxLinux学习之路Linux

Linux Makefile

2017-06-23  本文已影响103人  故事狗

Makefile的基本概念

GNU make最初是Unix系统下的一个工具,设计之初是为了维护C程序文件不必要的重新编译,他是一个自动生成和维护目标程序的工具
make是一个解释Makefile文件中指令的命令工具,其最基本的功能就是通过Makefile文件来描述源程序之间的相互关系并自动维护编译工作,他会告知系统以何种方式编译和链接程序。
Makefile写好之后,每次改变了某些源文件只要执行make命令($ make
所有必要的重新编译将执行,make程序利用Makefile中的数据和每个文件的最后修改时间来确定哪个文件需要更新,对于需要更新的文件,make程序执行Makefile数据中的定义的命令来更新。

GNU make的主要功能是读进一个文本文件Makefile,并根据Makefile的内容执行一系列工作。

Makefile的默认文件名为GNUmakefile、makefile或Makefile,当然也可以在make命令行中指定别的文件名。如果不特别指定,make命令在执行时,将按照顺序查找默认的makefile文件。

Makefile是一个文本形式的数据库文件,其中包含了一些规则,来告诉make处理哪些文件以及如何处理这些文件。

这些规则主要是描述哪些文件(target目标文件)是从哪些别的文件(dependency依赖文件)中产生而来的,以及用什么命令(command)来执行这个过程

依靠这些信息,make会对磁盘上的文件进行检查,如果目标文件的生成或被改动时的时间(文件的时间戳)至少比它的一个依赖文件还旧的话,make就执行相应的命令,已更新目标文件。目标文件不一定是最后的可执行文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。

GNU make工作流程

  1. 查找当前目录下的Makefile文件

一个Makefile文件主要有一系列规则,每条规则都必须包含以下内容:

  1. 一个目标(target),即make最终需要创建的文件,如可执行文件或目标文件,目标也可以是要执行的动作,如clean
Makefile文件

图中,蓝绿色的为目标,白色的为依赖文件,红色的为命令,蓝色的为注释

目录文件结构 执行make后生成的文件以及可执行程序 执行makefile中定义的clean 修改了部分文件,只会对编辑的文件进行修改 重复编译会提示

make命令

标准形式:$ make [选项] [宏定义] [目标文件]

指定Makefile文件 不显示执行信息

Makefile目标文件

参数“目标文件”,对于make命令来说,也是一个可选项,如果在执行make命令时带有该参数,可以输入一下命令:$ make 目标文件
如果省略目标文件参数,就会生成Makefile中定义的第一个目标文件。因此,常见的用法就是经常把用户最终想要的目标文件(可执行程序)放在Makefile文件的首要位置,这样用户只需要执行make命令即可。

单独执行hello.o的相关指令

Makefile规则语法

#注释
目标文件:依赖文件列表
<Tab>命令列表
#.......

注释:和shell脚本一样,Makefile语句行的注释采用"#"符号
目标:目标文件的列表,通常指程序编译过程中生成的目标文件(.o文件)或最终的可执行程序,有时也可以是要执行的动作,如“clean”这样的目标

Makefile中变量的使用

Makefile中的变量就像一个环境变量。事实上,环境变量在make中也被解释为make的变量。这些变量对大小写敏感,一般使用大写字母。几乎可以从任何地方引用定义的变量。

使用变量来写的Makefile文件 make命令执行结果
make工具还有一些特殊的内部变量,根据每一个规则内容定义。
$@:指代当前规则下的目标文件列表
$<:指代以来文件列表中的第一个依赖文件
$^:指代以来文件中的所有依赖文件
$?:纸袋以来列表中新于对应目标文件的列表
使用特殊的内部变量修改Makefile文件 使用特殊内部变量来make项目测试

Make自动推导

GNU的make功能很强大,它可以自动推导文件以及文件的依赖关系后面的命令,浴室我们就没必要去为每一个".o"文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
只要make看到一个.o文件,他就会自动的把“.c”文件加在依赖关系中,如果马克找到一个test.o,那么test.c就会是test.o的依赖文件,并且在gcc -c test.c也会被推导出来。

自动推导的版本 make过程
上一篇下一篇

猜你喜欢

热点阅读