什么是Makefile文件
- 一个工程,源文件不计其数,按照类型、功能、模块分别放在对应的若干个目录中
- Makefile定义了一系列的规则,比如定义文件编译的先后顺序。类似shell脚本,也可以执行操作系统的命令
- Makefile带来的好处是自动化编译
- 文件的命名 makefile 或者 Makefile
- Makefile规则 :其可以定义一个或者多个 规则
- 目标 ... : 依赖 ...
- 目标:最终要生成的文件 (伪目标除外)
- 依赖:生成目标所需要的文件或者是目标
- 命令:通过执行命令对依赖生成目标 (命令之前使用 Tab进行缩进)
工作原理
- 命令在执行之前,需要检查规则中依赖是否存在
- 如果存在:执行命令
- 如果不存在:向下检查其他的规则,检查有没有一个规则是用来生成这个依赖的,如果找到,就执行规则中的命令
- 检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
- 如果依赖的时间比目标时间晚,需要重新生成目标
- 如果依赖的时间比目标时间早,目标不需要更新,对应规则中的命令不需要被执行
app:sub.o add.o mult.o main.ogcc sub.o add.o mult.o main.osub.o:sub.cgcc -c sub.c -o sub.oadd.o:add.cgcc -c add.c -o add.omult.o:mult.cgcc -c mult.c -o mult.omain.o:main.cgcc -c main.c -o main.o
内容详解
- 自定义变量
- 预定义变量
- AR: 归档维护程序的名称 默认数值为 ar
- CC:C 编译器的名称 默认数值为cc
- CXX:C++编译器的名称 默认数值为g++
- $@:目标的完整路径
- $<: 第一个依赖的文件的名称
- $^ :所有的依赖文件的
- 获取变量的数值
app:mian.c a.c b.cgcc -c main.c a.c b.capp:main.c a.c b.c$(CC) -c $^ -o $@
app:sub.o add.o mult.o main.ogcc sub.o add.o mult.o main.osub.o:sub.cgcc -c sub.c -o sub.oadd.o:add.cgcc -c add.c -o add.omult.o:mult.cgcc -c mult.c -o mult.omain.o:main.cgcc -c main.c -o main.o模式匹配%.o:%.c% 通配符,匹配一个字符串
%.o:%.cgcc -c $< -o $@
函数
(wildcard PATTERN)
- 功能:获取指定目录下指定类型的文件列表
- 参数:PATTERN 指的是某个或者多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格进行间隔
- 返回:得到的若干个文件的文件列表 文件名字之间使用空格进行间隔
例子
$(wildcard *.c ./sub/*.c)返回数值的格式:a.c b.c d.c e.c f.c
$(patsubst <pattern>,<replacement>,<text>)
- 功能:查找<text>中的单词(单词以“空格”、“Tab”或者"回车"、"换行"分隔)是否符合模式<pattern>,如果匹配的话,则用<replacement>替代
- <pattern> 可以包括通配符"%" 表示任意长度的子串。如果<replacement>中 也包含“%s”,那么<replacement>中的这个'%',将是<pattern>中的%所代表的子串
- 使用'\'进行转义 ,即 \%表示真实含义的%字符
例子
$(patsubst %.c , %.o , x.c bar.c)返回数值的类型 x.o bar.o
删除 所有的.o 文件
.PHONY:clean //将clean作为伪目标,就不会生成clean文件
clean:rm $(objs) -f
CMakeLists.txt文件的参考链接
- CMakeLists模板持续更新中,欢迎补充
- CMakeLists.txt编写常用命令
- CMake 语法 - 详解 CMakeLists.txt
- CMakeLists.txt 语法介绍与实例演练
- 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)
- Cmake知识----编写CMakeLists.txt文件编译C/C++程序