make的介绍
make是一个自动化工具,可以进行批量的编译操作,名为makefile的文件一旦写好,只需要一个make
命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make还有一个优点,就是如果一个大型的项目里面部分文件出现改动,那么就需要重新编译,如果全部编译一边的话就会消耗大量时间,如果使用make的话就可以只编译改动的文件和与改动文件有关的文件,这样就节省了大量的时间。
关于make的优点的机制就是,当执行make指令的时候,系统会先去对比目标文件和依赖文件的时间关系。如果依赖文件时间比目标文件晚,就证明需要重新编译,而如果比目标文件早,就证明无须再编译,并且这种检测是递归的,比如下面这个案例,make指令在检测第一条规则的时候,会进入有关txt.o的规则去检测其依赖文件和目标文件的时间关系,然后再回到第一条规则中去进行检测。
make的基本语法
目标文件名:依赖文件名
(键盘输入一个tab)规则的具体实现
其中注意在第二行必须是一个tab键,不是八个空格。
make中变量的使用
make中和shell一样可以使用变量,方便我们提高效率。
make中变量分为三种:自动变量,自定义变量,隐式变量
自动变量
和其名字一样,是在执行make指令时自动生成的,在不同的规则中表达的意思是不一样的,就像如果一个人是一个学生,然后有两个班,1班和2班,在1班就自动生成他是1班的学生,在2班就自动生成他是2班的学生
自动变量的表示形式和其含义
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
自动变量的优点
在使用自动变量的时候,可以方便提高效率(其实就是偷懒),比如你在使用编写规则的时候,依赖文件名很长,你不想写,就可以直接一个$+表示就行了,你就不用再自己打一遍名字了
自定义变量
自定义变量的机制和c语言里面的预定义一样,提前声明一个变量的名字和其表达的意思,在使用时就可以直接使用变量名就行了。在更改的时候也不用一个一个去更改,直接在声明部分更改就可以了。
自定义变量的用法
变量名 = 内容(可以是一个文件名,也可以是多个文件的名字)
还可以追加的赋值
变量名 +=追加的内容(生成的变量的值为原来内容加上追加的内容)
注意: Makefile 中变量的命名可以使用字符、数字和下划线,但是要注意变量名对大小写是敏感的。
在引用的时候和在shell中有一些不一样,shell中是${变量名},但是make中是$(变量名),make中使用的是(),这点需要注意。
特殊用法
可以在shell中给自定义变量赋值
具体做法是
make 变量名=内容
隐式变量
是系统提前就已经定义好了的可以直接使用的
AR
函数库打开包程序。默认命令是“ar”
AS
汇编语言编译程序。默认命令是“as”
CC
C语言编译程序。默认命令是“cc”
CXX
C++语言编译程序。默认命令是“g++”
CO
从RCS文件中扩展文件程序。默认命令是“co”
CPP
C程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) -E”
FC
Fortran和Ratfor的编译器和预处理程序。默认命令是”f77”
GET
从SCCS文件扩展文件的程序。默认命令是“get”
LEX
Lex方法分析器程序(针对于C或Ratfor)。默认命令是”lex”
PC
Pascal语言编译程序。默认命令是”pc”
YACC
Yacc文法分析器(针对C程序)。默认命令是“yacc”
YACCR
Yacc文法分析器(针对Ratfor程序)。默认命令是“yacc -r”
MAKEINFO
转换Texinfo源文件(.texi)到info文件程序。默认命令是“makeinfo”
TEX
从TeX源文件创建TeX DVI文件的程序。默认命令是“tex”
WEAVE
转化Web到TeX的程序。默认命令是“weave”
TEXI2DVI
从Texinfo源文件创建TeX DVI文件的程序。默认命令是“texi2dvi”
CWEAVE
转化C Web到TeX的程序。默认命令是“cweave”
TANGLE
转换Web到Pascal语言的程序,默认命令是”tangle“
CTANGLE
转换C Web到C。默认命令是”ctangle“
RM
删除文件命令。默认命令是”rm -f“
特殊规则的使用
在makefile文件中可以编写一些特殊的规则来进行操作,比如输出,清理之类的
用法
特殊规则名(自己定义):(没有依赖文件)
(一个tab键)具体实现
引用方法
make 规则名
案例
案例讲解
echo就是输出(123)。
clear就是删除后缀为.o的文件,我们在编译的时候会生成大量的中间文件,可以通过这个用法清除中间产生的不必要的文件,释放空间。