1. 什么是make?
make是个命令,是个可执行程序,用来解析Makefile文件的命令这个命令存放在 /usr/bin/
2. 什么是makefile?
makefile 是个文件,这个文件中描述了咱们程序的编译规则咱们执行make命令的时候,make命令会在当前目录下找makefile文件,根据makefile文件里的规则,编译咱们的程序。
注意:Makefile规则文件是咱们程序员根据自己的程序,编写的编译规则
3. 采用Makefile的好处
3.1 简化编译程序的时候输入得命令,编译的时候只需要敲make命令就可以了
3.2 可以节省编译时间,提高编译效率
4. GNU make是一种代码维护工具
4.1 make工具会根据makefile文件定义的规则和步骤,完成整个软件项目的代码维护工作。
4.2 一般用来简化编译工作,可以极大地提高软件开发的效率。
4.3 windows下一般由集成开发环境自动生成
4.4 linux下需要由我们按照其语法自己编写
5. make主要解决两个问题
5.1 问题一:大量代码的关系维护
5.1.1 大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及维护
5.1.2 把代码维护命令及编译命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译
5.2 问题二:减少重复编译时间
在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间
6. makefile语法规则
目标:依赖文件列表
<Tab> 命令列表
目标:通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个动作的名称
依赖文件:是用来输入从而产生目标的文件
一个目标通常有几个依赖文件(可以没有)
命令:make执行的动作,一个规则可以含几个命令(可以没有)
有多个命令时,每个命令占一行
7. make命令格式
make [ ‐f file ] [ targets ]
7.1 [ -f file ]
make默认在工作目录中寻找名为GNUmakefile、makefile、Makefile的文件作为
makefile输入文件,-f 可以指定以上名字以外的文件作为makefile输入文件
7.2 [ targets ]
若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出,指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空格隔开)。
7.3 一般使用的时候:直接make就可以
7.4 假想目标
前面makefile中出现的文件称之为假想目标
假想目标并不是一个真正的文件名,通常是一个目标集合或者动作可以没有依赖或者命令一般需要显示的使用make + 名字,显示调用,运行时使用make clean 就会执行clean后面的命令
all:exec1 exec2
clean:
<Tab>rm *.o exec
8. makefile变量
8.1 makefile变量概述
makefile变量类似于C语言中的宏,当makefile被make工具解析时,其中的变量会被展开。
8.2 变量的作用
保存文件名列表
保存文件目录列表
保存编译器名
保存编译参数
保存编译的输出
8.3 变量的分类
8.3.1 自定义变量
在makefile文件中定义的变量。
make工具传给makefile的变量。
8.3.2 系统环境变量
make工具解析makefile前,读取系统环境变量并设置为makefile的变量。
8.3.3 预定义变量(自动变量)
9. 自定义变量语法
9.1 定义变量
变量名=变量值(等号两边不可加空格)
9.2 引用变量
$(变量名)或${变量名}
9.3 注意
makefile变量名可以以数字开头
变量是大小写敏感的
变量一般都在makefile的头部定义
变量几乎可在makefile的任何地方使用
10. 预定义变量
makefile中有许多预定义变量,这些变量具有特殊的含义,可在makefile中直接使用
$@ |
目标名 |
$< |
依赖文件列表中的第一个文件 |
$^ |
依赖文件列表中除去重复文件的部分 |
AR |
归档维护程序的程序名,默认值为ar |
ARFLAGS |
归档维护程序的选项 |
AS |
汇编程序的名称,默认值为as |
ASFLAGS |
汇编程序的选项 |
CC |
C编译器的名称,默认值为cc |
CFLAGS |
C编译器的选项 |
CPP |
C预编译器的名称,默认值为$(CC) -E |
CPPFLAGS |
C预编译的选项 |
CXX | C++编译器的名称 |
CXXFLAGS |
C++编译器的选项 |