Makefile工程管理文件
Makefile文件主要作用
自动化编译
- 指定编译工具和编译选项
- 编写好依赖关系后实现自动化编译
管理项目
- 管理源文件和目标文件之间的依赖关系
- 自动选择修改过的文件进行编译
生成可执行文件
- 定义生成可执行文件的规则和依赖关系
清理和重建
- 清理编译中间文件
- 删除目标文件
- 删除可执行文件
打包和发布
- 定义项目打包操作
- 定义项目发布操作
自动化编译方式
- 在终端执行:
make - 执行
make命令时自动查找当前目录下的Makefile文件 - 默认查找顺序:
- 优先查找大写的
Makefile文件 - 其次查找小写的
makefile文件
- 优先查找大写的
- 指定目标执行:
make target
Makefile文件编写格式
依赖关系定义
- 基本语法:
目标文件:依赖文件列表 - 目标文件:需要生成的文件
- 可执行文件
- .o目标文件
- 库文件
- 依赖文件:生成目标文件所需的文件
- 一般为
.cpp源代码文件
- 一般为
Makefile变量定义
基本语法
- 定义语法:
变量名 赋值符号 值 - 变量特性:
- 没有数据类型
- 一般作为字符串使用
Makefile赋值方式
就地赋值(简单赋值)
- 语法:
变量名:=值 - 示例:makefile
VALUE:="ABCDEF"
递归赋值(向后展开赋值)
- 语法:
变量名=值 - 示例:makefile
A=$(B) # 将B的值赋给A B:="123" # 此时A和B的值均为"123"
追加赋值
- 语法:
变量名+=值1 值2 值3 ... - 示例:makefile
A+=1 2 3 4 5 6 # 等价于A包含"1 2 3 4 5 6"的集合
条件赋值
- 语法:
变量名?=值 - 赋值条件:变量未被定义或未被赋值时进行赋值
- 示例:makefile
A?=123 # 仅当A未定义时赋值
变量引用
- 语法:
$(变量名) - 示例:makefile
VALUE:=10 $(VALUE) # 引用VALUE的值
自动变量
| 变量 | 描述 |
|---|---|
$* | 不包含扩展名的目标文件名 |
$@ | 目标文件的完整名称 |
$+ | 所有依赖文件名(含重复,空格分隔) |
$^ | 所有依赖文件名(不含重复,空格分隔) |
$< | 第一个依赖文件名 |
$? | 修改时间比目标文件晚的依赖文件(空格分隔) |
Makefile函数
文件名展开函数(wildcard)
- 功能:搜索指定路径下的特定文件
- 参数数量:1个(文件名通配表达式)
- 示例:makefile
SOURCES +=$(wildcard *.cpp) # 获取当前目录下所有.cpp文件 - 注意事项:
- 目录相对于Makefile文件
- 不会搜索子目录
字符串替换函数(patsubst)
- 功能:对字符串内容进行替换操作
- 参数数量:3个
- 参数1:原有格式
- 参数2:替换格式
- 参数3:需要替换的字符串
- 示例:makefile
OBJECT += $(patsubst %.cpp,%.o,$(SOURCES)) # 将所有.cpp结尾的文件名替换为.o结尾 - 注意事项:
%为通配符,仅作用于Makefile内部- 不会实际改变文件名
遍历列表函数(foreach)
- 功能:迭代空格分隔的列表内容
- 参数数量:3个
- 参数1:当前元素变量名
- 参数2:列表
- 参数3:对当前元素的操作
- 示例:makefile
OBJECTS += $(foreach filename,$(SOURCES),$(filename:.cpp=.o))
Makefile编写规范
缩进规则:
- 使用
Tab缩进描述包含关系 - 指令顶格写(命令部分必须以Tab开头)
- 使用
命名规范:
- 变量名使用大写字母
文件规范:
- Makefile没有文件扩展名
- 可命名为
Makefile或makefile - 优先执行大写的
Makefile文件
特殊变量:
gcc被定义为cc变量
文件位置:
- Makefile必须放在工程目录下
作业
编写适合个人工程的Makefile文件,用于编译后续工程代码
