文章目录
一、Makefile文件和make工具
简单来说,Makefile就是一个文件,他管理了多个文件
make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则),在 Makefile 文件中描述了整个工程所有文件的编译顺序、编译规则
二、为什么要用Makefile文件
在我们刚学习linux期间,大多使用的是gcc编译器来编译 .c 文件,并且写的代码就几十行,都在一个 .c 文件中,但是当我们以后进入公司之后,代码可能会变成几千上万行,那个时候就会使用多文件进行封装,每个同事负责某一个功能,最后再整合起来。
gcc和make的区别
- 两者都可以生成可执行文件,gcc是在编译时,不管编译几次都会把所有文件都重新编译,比如现在我有 1.c 2.c 3.c 4.c ,这四个文件之前编译过一次,现在我只修改了 3.c 但是如果我重新用gcc编译,他还是会把 1.c 2.c 3.c 4.c 全部重新编译,大大降低了开发效率,如果代码量很大,那么编译都需要很久
- make则是根据文件的时间戳来进行编译,如果文件的时间戳没有发生改变,则不会编译该文件,大量减少了编译的时间
三、Makefile文件
1.认识Makefile文件
这里我创建一个Makefile文件,直接使用 vim makefile
注意: Makefile 文件中,命令行前面是用 tab 键来缩进的,不能用空格空格键
如果命令行是用 tab 键来缩进,那命令行就会变颜色
2.Makefile文件格式
上一个Makefile文件中使用的还是 gcc 编译器,而Makefile文件由一系列规则构成。每条规则的形式如下
目标文件:依赖文件
命令
- 目标文件一般就是最终生成可执行文件,而生成目标文件需要去找他所需的所有依赖文件,如果依赖文件也需要其他的文件,就一直找,直到不需要依赖文件,就好比递归,需要一层一层递归,直到最后不需要为止
这里拿 add.c add.h main.c 来举例,我现在需要把 add.c 和 main.c编译出可执行文件
执行该Makefile文件
执行完该Makefile文件后,显示了文件中的执行命令,并且文件中多出了 add.o , main.o 还有我们想要的myadd可执行文件
我们写的这个Makefile中还有一句标签为
clean:
rm -f *.o myadd
而这里的clean只是一个标签名,我们可以使用make工具来操作这行命令,例如
执行之后,所有 .o 文件和myadd可执行文件也被删除了
四、Makefile中的变量
1.自定义变量
Makefile 中允许使用等号自定义变量
Makefile中的变量定义和 shell 变量的定义非常相似,不同的是 Makefile中的变量的名称可以是任何不包含 :, #,= 和空字符的字符序列,并且等号两边可以有空格(shell 定义变量的等号两个不允许出现空格)
变量名=值 --等号两边不能有空格
2.变量的调用
make 变量支持和 shell 变量一样,在变量标识符前加美元符 $ 来引用,例如
如果你不想看到执行命令时,把makefile中的命令再打印一遍可以在makefile中的命令前加一个@
3.变量的赋值
Makefile一共提供了四个赋值运算符 (=、:=、?=、+=)
1).普通赋值 =
如果按照c语言的逻辑,var2应该等于12,但是这里最后打印var2的值为100,所以普通赋值表示赋值最新的变量值
2).立即赋值 :=
立即赋值则是直接赋值,不会在改变
3).询问赋值 ?=
如果该变量前面已经赋过值了,此次就不能再赋值了,如果没有就赋值,只有在该变量为空时才设置值
4.追加赋值 +=
类似字符串连接,将值追加到变量末尾,在追加的时候,自动添加空格
4.特殊变量
$^ --表示所有依赖文件
$@ --表示目标文件
$< --表示第一个依赖文件
% --通配符,表示所有,和linux中的 * 一样
利用这些特殊变量和自定义变量,我们就可以将Makefile文件写的更加简洁