深入解析:【Linux】makefile
目录
基本概念:
1、定义
一种项目管理工具,支援管理编译项目,节省编译时间就是 Makefile 是用于自动化编译程序的脚本材料,利用定义规则来指定如何编译和链接程序,尤其适合多文件计划。
2、工作原理
文件命名:makefile 或者 Makefile,注释使用 #,执行记录:在 makefile 所在路径下执行 make
当执行 `make` 命令时:
1. Make 会在当前目录查找 Makefile 或 makefile
2. 找到第一个目标作为默认目标并执行
3. 检查目标与依赖的时间戳,仅当依赖比目标新时才执行命令
3、优点
1、便捷的编译管理代码,不用每次都写复杂的编译命令
2、大大节省编译时间,减少编译成本
通过3、重用性极强,能够反复使用编译不同的项目
4、三要素
1、目标:完成编译,生成可执行文件
2、依赖:编译需要的文件,源文件、头文件、库文件、资源文件
3、命令:生成可执行文件需要执行的命令
5、语法
目标:依赖
(tab) 命令
例子一:
有文件如下,现生成一个a.c资料的makefile


make:执行,会打印出要执行的命令

例子二:
多个文件的计划写makefile,如下图


把上述过程拆分成编译期和链接期:

为什么说makefile会减少编译时间?
编译过程 =预处理期 + 编译期 + 汇编期+链接期
编译期(把源文件生成.o 文件)+ 链接期(把所有的.o 和库材料链接生成可执行文件)
节省编译时间:采用空间换时间的方式,第一次编译的时候不会节省编译时间,会把生成.o 文件保存下来。
以后,每次检查哪个源文件被修改了,只重新编译被修改的源文件,其他源文件不重新编译,直接使用保存的.o 记录,连接生成可执行文件。
怎么检查哪个源文件被修改了?
比较.c 文件的修改时间和.o 文件的修改时间
注意事项:
1.自顶向下建立依赖关系
2.默认只有一个目标,但可能有多个中间目标,多个目标之间必须有主从关系
makefile 的变量定义和使用
1、自定义变量
无需指定类型,默认都是字符串
变量名允许由字母、数字、下换线构成,只是不能以数字开头
为了与高级语言区分开,一般用大写定义变量名
使用变量 :$(变量名)
makefile 中常用变量:

2、特殊变量(makefile 内置)
$@:表示目标名
$^:表示所有的依赖项
$<:表示第一个依赖项
例子:

makefile 内置函数和内建语法

上一个例子经过修改:

伪目标
不是实际文件,通常用于定义操作,与主目标不同,没有依赖,只有目标和命令


执行:make+功能目标
e.g. make clean
浙公网安备 33010602011771号