Skip to content

Makefile工程管理文件

Makefile文件主要作用

自动化编译

  • 指定编译工具和编译选项
  • 编写好依赖关系后实现自动化编译

管理项目

  • 管理源文件和目标文件之间的依赖关系
  • 自动选择修改过的文件进行编译

生成可执行文件

  • 定义生成可执行文件的规则和依赖关系

清理和重建

  • 清理编译中间文件
  • 删除目标文件
  • 删除可执行文件

打包和发布

  • 定义项目打包操作
  • 定义项目发布操作

自动化编译方式

  • 在终端执行:make
  • 执行make命令时自动查找当前目录下的Makefile文件
  • 默认查找顺序
    1. 优先查找大写的Makefile文件
    2. 其次查找小写的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编写规范

  1. 缩进规则

    • 使用Tab缩进描述包含关系
    • 指令顶格写(命令部分必须以Tab开头)
  2. 命名规范

    • 变量名使用大写字母
  3. 文件规范

    • Makefile没有文件扩展名
    • 可命名为Makefilemakefile
    • 优先执行大写的Makefile文件
  4. 特殊变量

    • gcc被定义为cc变量
  5. 文件位置

    • Makefile必须放在工程目录下

作业

编写适合个人工程的Makefile文件,用于编译后续工程代码

知识如风,常伴吾身