C语言之MakeFile
Makefile 的引入是为解决多文件项目中手动编译繁琐易错、缺乏自动化构建、项目管理维护困难以及跨平台构建不便等问题,实现自动化、规范化的项目构建与管理
MakeFile
简单的来说,MakeFile就是编写编译命令的文件
文件编写格式
目标:依赖文件列表
<Tab>命令列表
1,目标:通常是要产生的文件名称,目标可以是可执行文件或其他obj文件,也可是一个动作的名称
2,依赖文件:是用来输入从而产生目标文件,一个目标通常有几个依赖文件(也可以没有)
3,命令:make执行的动作,一个规则可以含几个命令(也可以没有);有多个命令是,每个命令占一行
如:
main:main.c
gcc main.c -o mainclear:rm main注意:当目标后没有依赖文件,我们将其称之为假想目标
变量
系统变量
由系统提供的变量
make工具会拷贝系统的环境变量并将其设置为makefile的变量,在makefile中可直接读取或修改拷贝后的变量
查看系统变量命令:
env
修改或添加系统变量
export 变量名=值
注意:
export是导入的意思
注意:
只是临时修改,当dos关闭后,将不存在
如:makefile编写如下
main:make.o myutils.o
gcc main.o myutils.o -o main
clear:
rm main *.o
myprint:
echo ${PWD}
*.o
是一个通配符表达式,表示要删除当前目录下所有后缀为.o
的目标文件
echo
是用于在终端打印输出内容的命令,${PWD}
是一个环境变量引用(在类 Unix 系统中,PWD
表示当前工作目录,即 “Present Working Directory”),所以当执行这个myprint
目标对应的命令时,会在终端打印出当前所在的工作目录路径信息。自定义变量:程序员在编写makefile文件中自定义的变量
预定义变量:make命令提供的变量
自定义变量
定义: 变量名=变量值
使用:
取值;${变量名}或$(变量名)
拼接:变量名+=值
注意:
1,makefile变量名可以以数字开头
2,变量的大小是敏感的
3,变量一般都在makefile的头部定义
4,变量几乎可以在makefile的任何地方使用
预定义变量
makefile 中有许多预定义变量,这些变量具有特殊的含义,可在 makefile 中直接使用。$@ 目标名$< 依赖文件列表中的第一个文件$^ 依赖文件列表中除去重复文件的部分AR 归档维护程序的程序名,默认值为 arARFLAGS 归档维护程序的选项AS 汇编程序的名称,默认值为 asASFLAGS 汇编程序的选项CC C 编译器的名称,默认值为 gccCFLAGS C 编译器的选项CPP C 预编译器的名称,默认值为 $(CC) -ECPPFLAGS C 预编译的选项CXX C++编译器的名称,默认值为 g++CXXFLAGS C++编译器的选项
编写模板
EXEC = 可执行文件名
OBJ = 二进制文件名列表
FLAG = -wall -g
$(EXEC):$(OBJ)$(CC) $(OBJ) -o $(EXEC) $(-wall -g)
二进制文件名1.o:源文件名1.c
$(CC) -c 源文件名.c -o 二进制文件名.o
二进制文件名2.o:源文件名2.c
$(CC) -c 源文件名.c -o 二进制文件名.o
clear:rm $(EXEC) *.o
注意:源文件名与二进制文件名相同
make命令
解析makefile文件的命令
检查make命令是否存在
which make
或
make --version
GNU Make名词
GNU make 是一种代码维护工具, make 工具会根据 makefile 文件定义的规则和步骤,完成整个软件项目的代码维护工作优点:1、管理我们的源文件2、会检查每个源文件是否被修改 只会再次只编译修改过的源文件(提高编译效率)缺点:makefile文件: 在 Window 上的集成开发环境下,会自动生成, 在 Linux 下需要手动编写。
语法 :make 目标注意: 目标可以没有 , 默认执行第一个目标注意:1、 make 默认在工作目录中寻找名为 GNUmakefile 、 makefile 、 Makefile 的文件作为 makefile 输入文件2、 -f 可以指定以上名字以外的文件作为 makefile 输入文件3、若使用 make 命令时没有指定目标,则 make 工具默认会实现 makefile 文件内的第一个目标,然后退出。如 : 在控制台输入1,输入 make, 默认执行 makefile 文件中第一个目标中命令2,输入 make 目标 , 执行 makefile 文件中指定的目标中的命令3,当 makefile 的文件名不是 GNUmakefile 、 makefile 、 Makefile 时 , 可以输入make -f 文件名 , 指 makefile 文件