目录
makefile是什么?
通常一个大型程序是由多个程序模块文件构成的,按照其功能划分,模块文件会分布在不同的目录
中。模块文件之间有包含头文件、调用函数的情况,它们之间存在依赖关系。
而makefile中就存放着这些函数的依赖关系。make命令通过解析makefile文件,自动找出变更的文件以及依赖此变更文件的相关文件,然后对所有受影响的相关文件执行事先定义好的命令规则。
注意:make命令并不是由于编译程序
其优点在于:只编译该文件和受该文件影响的相关文件,其他不受影响的文件不重新编译,从而提高了编译效率。
makefile的编写
基本语法:
注意:“目标”与“依赖文件列表”之间的冒号不可少。
(1)目标文件是指此规则中想要生成的文件,可以是.o 结尾的目标文件,也可以是可执行文件,也可以是个伪目标,后面会介绍伪目标(2)依赖文件是指要生成此规则中的目标文件,需要哪些文件通常依赖文件不是一个(3)命令是指此规则中要执行的动作,这些动作是指各种 shell 命令。命令可以有多个,但 每个命令要单独占用一行,在行首必须以 Tab 开头 。
示例:
有add.c,max.c,main.c三个文件,编写一个makefile实现自动编译
makefile代码:
all:main
main:add.o max.o main.o
gcc -o main add.o max.o main.o
add.o:add.c
gcc -c add.c
max.o:max.c
gcc -c max.c
main.o:main.c
gcc -c main.c
clean:
rm -rf *.o main
make运行后可以直接运行main主函数:
stat查看makefile的更新
Linux 中,文件分为属性和数据两部分,每个文件有三种时间,分别用于记录与文件属性和文件数
据相关的时间,这三个时间分别是 atime,ctime,mtime。
(1) atime ,即 access stime,最近访问时间。(2) ctime ,即 change time ,表示文件属性或数据的改变时间,每当文件的属性或数据被修改时,就会更新 ctime ,也就是说 ctime 同时跟踪文件属性和文件数据变化的时间。(3) mtime ,即 modify time ,表示文件数据部分的修改时间,每次文件的数据被修改时就会更新 mtime 。从概念中可以看出, mtime的变动必定伴随着ctime的改变。
伪目标
make规定,当规则中不存在依赖文件时,这个目标文件名就称为一一伪目标。
伪目标,顾名思义,也就是不产生真实的目标文件,所以当然也就不需要依赖文件了。于是,伪目标所在的规则就变成了纯粹地执行命令,只要给 make 指定该伪目标名做参数,就能让伪目标规则中的命令直接执行。
前面makefile中的第一行中的all就是一个伪目标。
注意:伪目标不能和真实目标文件同名,否则就失去伪目标的意义了,为了避免伪目标和真实目标文件同名的情况,可以用关键字“ .PHONY ”来修饰伪目标。格式为“.PHONY:伪目标名”,这样不管与伪目标同名的文件是否存在, make 照样执行伪目标处的命令。
约定俗成的伪目标
all |
通常用来完成所有模块的编译工作
|
clean |
通常用于清空编译完成的所有目标文件, 一般用rm命令实现
|
printf |
通常用于打印已经发生改变的文件
|
test |
通常用于测试makefile流程
|
tar |
通常用于将文件打包成 .tar 文件,也就是所谓的归档文件
|
dist |
通常用于将打包文件后的. tar文件再压缩成 .gz文件
|
自定义变量和系统变量
makefile中自定义变量
makefile文件中也可以自定义变量。
变量的定义格式:变量名=值, 需要注意的是:makefile中的变量值只支持字符串形式,即使等号后面是数字,也会被作为字符串处理;此外,等号后多个值时,每个值用空格隔开。
系统变量
直接附表
makefile的规则还有很多,可以在之后的使用中不断完善。