Makefile
- 什么是make?
- make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令
- 这个命令存放在 /usr/bin/
- 什么是 makefile?
- makefile 是个文件,这个文件中描述了我们程序的编译规则
- 咱们执行 make 命令的时候, make 命令会在当前目录下找 makefile 文件,根据 makefile 文件里的规则,编译程序。
- 注意: Makefile 规则文件是,程序员根据自己的程序编写的编译规则
- 采用 Makefile 的好处
- 简化编译程序的时候输入的命令,编译的时候只需要敲 make 命令就可以了
- 可以节省编译时间,
提高编译效率
1. make概述
① GNU make
是一种代码维护工具
② make 工具会 根据 makefile 文件定义的规则和步骤,完成整个软件项目的代码维护工作
③ 一般用来简化编译工作,可以极大地提高软件开发的效率
④ windows 下一般由集成开发环境自动生成
⑤ linux 下需要由我们按照其语法自己编写
1.1 检查是否有 make命令
命令:检查版本
make --version
1.2 make 和 Makefile的区别
make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令
makefile 是个文件,这个文件中描述了项目资源的编译规则。
2. makefile
2.1 优点
- 管理我们的源文件
- 会检查每个源文件是否被修改 再次只会编译修改过的源文件(提高编译效率)
2.2 语法及使用
- 语法:
[变量名 = 变量值]
[...]
目标1:依赖文件列表
<tab>编译命令1
<tab>编译命令2
目标2:依赖文件列表
<tab>编译命令1
<tab>编译命令2
目标3:依赖文件列表
<tab>编译命令1
<tab>编译命令2
...
解释:
1、目标:通常是要产生的文件名称,目标可以是可执行文件或其它 obj 文件,也可是一个动作的名称
2、依赖文件:是用来输入从而产生目标的文件一个目标通常有几个依赖文件(可以没有)
3、命令:make 执行的动作,一个规则可以含几个命令(可以没有)有多个命令时,每个命令占一行
例:
main:main.c
gcc main.c -o main
clear:
rm main
解释:其中
main
就是目标
,main.c
就是依赖文件
,gcc main.c -o main
就是命令
。注意:
当目标后面没有依赖文件,我们就将其称为假象目标
- 使用:
在控制台输入
make
命令注意:
make
默认在工作目录中
寻找名为GNUmakefile
、makefile
、Makefile
的文件作为 makefile 输入文件-f
可以指定以上名字以外的文件作为 makefile 输入文件- 若使用 make 命令时
没有指定目标
,则 make 工具默认
会实现 makefile 文件内的第一个目标
,然后退出。
例:在控制台输入
1,输入make,默认执行makefile文件中第一个目标中命令
2,输入make 目标,执行makefile文件中指定的目标中的命令
3,当makefile的文件名不是GNUmakefile、makefile、Makefile时,可以输入make -f 文件名,指定makefile文件
- 再次执行只会编译修改过的文件
各文件如下:
通过命令行运行多个文件:
步骤:
步骤1:编写makefile文件如下
main:main.o myutils.o gcc main.o myutils.o -o main clear: rm main *.o
步骤2:执行make命令查看,如下
步骤3:修改main.c文件,在次执行make命令
2.3 变量
2.3.1 分类
- 系统变量:
由系统提供的变量
make工具会拷贝系统的环境变量并将其设置为 makefile 的变量,在 makefile中可直接读取或修改拷贝后的变量。
查看系统变量命令:
env
修改或添加系统变量
export 变量名=值
注意
export是导入的意思
注意:
- 只是临时修改,当dos关闭后,将不在存在
- 如:makefile编写如下
main:main.o myutils.o gcc main.o myutils.o -o main clear: rm main *.o myprint: echo ${PWD}
-
自定义变量(重点)
程序员在编写makefile文件中自定义的变量
-
预定义变量(重点)
make命令提供的变量
2.3.2 自定义变量
语法:
定义变量:变量名=变量值
引用变量:$(变量名)或${变量名}
注意:
1、makefile 的变量名:makefile 变量名可以以数字开头
2、变量是大小写敏感的
3、变量一般都在 makefile 的头部定义
4、变量几乎可在 makefile 的任何地方使用
例:
EXEc = main
OBJ = main.o utils.o
FLAGS = -Wall -g
cc = gcc
$(EXEc):$(OBJ)
$(cc) $(OBJ) -o $(EXEc) $(-Wall -g)
main.o:main.c
$(cc) -c main.c -o main.o
utils.o:utils.c
$(cc) -c utils.c -o utils.o
clear:
rm $(EXEc) *.o
- 引用变量:定义的
变量
在下面用$()
或${}
替换-Wall -g
:忽略所有警告
2.3.3 预定义变量
makefile 中有许多预定义变量,这些变量具有特殊的含义,可在 makefile 中直接使用。
$@ 目标名
$< 依赖文件列表中的第一个文件
$^ 依赖文件列表中除去重复文件的部分
以下为了解
AR 归档维护程序的程序名,默认值为 ar
ARFLAGS 归档维护程序的选项
AS 汇编程序的名称,默认值为 as
ASFLAGS 汇编程序的选项
cc c 编译器的名称,默认值为 gcc
cFLAGS c 编译器的选项
cPP c 预编译器的名称,默认值为$(cc) -E
cPPFLAGS c 预编译的选项
cXX c++编译器的名称,默认值为 g++
cXXFLAGS c++编译器的选项
如:
EXEc = main
OBJ = main.o utils.o
FLAGS = -Wall -g
cc = gcc
$(EXEc):$(OBJ)
$(cc) $^ -o $@ $(-Wall -g)
#%:统配符
%.o:%.c
$(cc) -c $< -o $@
clear:
rm $(EXEc) *.o