目录
-
- 前言
- [一、Meson 概述与核心设计理念](#一、Meson 概述与核心设计理念)
-
- [1.1 定位与目标](#1.1 定位与目标)
- [1.2 技术架构](#1.2 技术架构)
- [1.3 Meson 与Ninja的关系](#1.3 Meson 与Ninja的关系)
- 二、安装与环境配置
- 三、基本使用与项目结构
-
- [3.1 典型工作流程](#3.1 典型工作流程)
- [3.2 一般项目结构示例(多模块):](#3.2 一般项目结构示例(多模块):)
- [3.3 开源项目编译示例:GTK4库](#3.3 开源项目编译示例:GTK4库)
- 四、高级特性详解
-
- [4.1 指定工具链(交叉编译)](#4.1 指定工具链(交叉编译))
- [4.2 配置头文件目录](#4.2 配置头文件目录)
- [4.3 配置库目录](#4.3 配置库目录)
- [4.4 控制静态库/动态库](#4.4 控制静态库/动态库)
- [4.5 完整配置示例](#4.5 完整配置示例)
- [4.6 高级技巧](#4.6 高级技巧)
- 五、应用场景与对比
- [六、为何 Meson 成为新宠?](#六、为何 Meson 成为新宠?)
-
- [⚡ 6.1 性能优势:构建速度与效率的革命](#⚡ 6.1 性能优势:构建速度与效率的革命)
- [🧩 6.2 语法现代化:降低维护成本](#🧩 6.2 语法现代化:降低维护成本)
- [🌐 6.3 全平台支持:拥抱异构开发生态](#🌐 6.3 全平台支持:拥抱异构开发生态)
- [🔗 6.4 生态融合:与现代工具链无缝协作](#🔗 6.4 生态融合:与现代工具链无缝协作)
- [📈 6.5 社区推力:头部项目的示范效应](#📈 6.5 社区推力:头部项目的示范效应)
- 七、学习建议与资源
前言
目前一些开源软件包的最新版本已不再使用configure
或者autogen.sh
脚本进行编译环境构建,而是改用了meson
,对于首次接触meson的人来说可能会比较陌生,故而整理了这篇文章用来简单介绍下meson。
一、Meson 概述与核心设计理念
1.1 定位与目标
Meson 是一个开源的自动化构建系统,专为提升构建效率和开发体验设计。其核心目标:
- 极速构建:通过优化依赖分析和默认集成 Ninja 后端,显著加速编译过程。
- 语法简洁 :采用类 Python 的声明式 DSL(领域特定语言),配置文件(
meson.build
)易读易写。 - 开箱即用:内置对单元测试、代码覆盖率、预编译头文件等现代开发工具的支持,无需额外脚本。
1.2 技术架构
- 分层设计:Meson 负责配置项目依赖和生成构建规则,Ninja 负责执行高效编译任务。
- 源外构建(Out-of-source Build):严格分离源码与编译输出目录,支持多配置并行(如 Debug/Release)。
1.3 Meson 与Ninja的关系
Meson 与 Ninja 是紧密协作的关系,不能完全独立工作。
-
⚙️ Meson 的核心依赖:Ninja 作为默认后端
- Meson 本身是构建配置生成器 ,负责解析
meson.build
文件、管理依赖关系并生成构建规则。而实际执行编译任务的是后端工具,Ninja 是其默认且最高效的后端 。 - 若未安装 Ninja,Meson 在生成构建目录(
meson setup builddir
)时会报错,提示找不到 Ninja 或版本不兼容 。
- Meson 本身是构建配置生成器 ,负责解析
-
🔄 替代后端的可能性(有限支持)
- Meson 支持切换其他后端,但需满足条件:
- Visual Studio/Xcode :通过
--backend=vs
或--backend=xcode
生成对应工程文件(如.sln
),此时无需 Ninja。但此方式仅适用于特定平台(如 Windows/macOS),且需提前安装对应 IDE 工具链 。 - None 后端 :Meson 1.1+ 支持
--backend=none
,仅生成安装规则而无构建规则。此模式无法编译代码,仅用于特殊场景(如纯配置项目)。
- Visual Studio/Xcode :通过
- Meson 支持切换其他后端,但需满足条件:
-
⚠️ 实际开发中的必要性
- 性能依赖 :Ninja 专为高速构建优化,是 Meson 实现极速增量编译 的关键。若替换为
make
等后端,会丧失速度优势 。 - 生态兼容性 :绝大多数 Meson 项目(如 GLib、QEMU)默认依赖 Ninja,删除将导致编译命令(如
meson compile
)失效 。
- 性能依赖 :Ninja 专为高速构建优化,是 Meson 实现极速增量编译 的关键。若替换为
二、安装与环境配置
平台 | 安装命令 |
---|---|
Linux (Debian/Ubuntu) | sudo apt install meson ninja-build |
Linux (Fedora/CentOS) | sudo dnf install meson ninja-build |
macOS (Homebrew) | brew install meson ninja |
Windows | 下载 MSI 安装包 或 pip3 install meson ninja (需 VS 开发者命令提示符) |
通用 Pip 安装 | pip3 install --user meson ninja |
验证安装:
meson --version
和ninja --version
。

三、基本使用与项目结构
3.1 典型工作流程
-
初始化项目
bashmeson init --name demo_project --language=c # 自动生成模板
生成结构:
demo_project/ ├── meson.build # 构建描述文件 └── main.c # 示例源码
-
配置构建目录
bashmeson setup builddir # 在 builddir 生成 Ninja 构建文件
-
编译项目
bashmeson compile -C builddir # 等效于 ninja -C builddir
-
测试与安装
bashmeson test -C builddir # 运行单元测试 meson install -C builddir # 安装到系统路径(默认 /usr/local)

文件/文件夹名称 | 类型 | 详细解释 |
---|---|---|
builddir |
文件夹 | 这是项目的构建目录,用于存放项目构建过程中生成的各类中间文件和最终产物。像编译生成的可执行文件、构建系统所需的配置文件等都会存放在这里。 |
demo_project.c |
文件 | 这是一个 C 语言源代码文件,包含了项目的主要 C 代码逻辑。通常开发者会在这个文件里编写程序的功能实现代码。 |
meson.build |
文件 | 这是 Meson 构建系统的配置文件。Meson 是一个用于自动化编译和构建项目的工具,meson.build 文件里会定义项目的构建规则,例如源文件列表、依赖库、编译选项等信息。 |
builddir/build.ninja |
文件 | 这是 Ninja 构建系统使用的构建文件。Ninja 是一个专注于快速构建的工具,build.ninja 文件由 Meson 生成,其中包含了具体的编译和链接命令,Ninja 会依据这个文件来执行实际的构建操作。 |
builddir/compile_commands.json |
文件 | 这是一个包含编译命令的 JSON 格式文件。很多开发工具(如代码编辑器、静态分析工具等)可以利用这个文件来了解项目的编译环境和编译命令,从而提供更准确的代码分析和自动补全功能。 |
builddir/demo_project |
文件 | 这通常是项目编译后生成的可执行文件。当 Meson 和 Ninja 完成项目的编译和链接操作后,就会在这个目录下生成这个可执行文件,用户可以直接运行它来执行项目的功能。 |
builddir/demo_project.p |
文件 | 这可能是 Meson 在构建过程中生成的用于存储项目特定信息的文件,一般包含了项目的元数据、依赖关系等,供 Meson 内部使用。 |
builddir/meson-info |
文件夹 | 该文件夹用于存放 Meson 收集的项目相关信息,例如项目的配置信息、依赖库信息等。这些信息可以帮助开发者和构建系统更好地了解项目的构建状态。 |
builddir/meson-logs |
文件夹 | 这里面存放的是 Meson 在构建过程中产生的日志文件。当构建过程中出现错误或者需要调试时,开发者可以查看这些日志文件来定位问题。 |
builddir/meson-private |
文件夹 | 这个文件夹包含了 Meson 内部使用的私有数据和临时文件,一般开发者不需要直接操作这个文件夹里的内容。 |
3.2 一般项目结构示例(多模块):
text
project/
├── meson.build
├── src/
│ ├── libutils.c
│ ├── libutils.h
│ └── main.c
└── tests/
└── test_libutils.c
-
顶层
meson.build
:mesonproject('my_project', 'c') subdir('src') # 包含子目录配置 subdir('tests')
-
src/meson.build
:mesonlib = static_library('utils', 'libutils.c') # 编译静态库 exe = executable('app', 'main.c', link_with: lib)
3.3 开源项目编译示例:GTK4库
源码下载链接:https://gitee.com/mirrors/gtk
- 配置构建 :
meson setup _build - 编译 :
meson compile -C _build - 安装(可选) :
meson install -C _build
四、高级特性详解
4.1 指定工具链(交叉编译)
(1)创建 Cross File 配置文件,创建一个 cross_file.txt
(文件名可自定义):
ini
[binaries]
c = 'arm-linux-gnueabihf-gcc'
cpp = 'arm-linux-gnueabihf-g++'
ar = 'arm-linux-gnueabihf-ar'
strip = 'arm-linux-gnueabihf-strip'
[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'cortex-a9'
endian = 'little'
(2)使用 Cross File 配置构建
bash
meson setup builddir --cross-file cross_file.txt
(3)在代码中检测目标平台
c
#ifdef __ARM_ARCH
// ARM 平台特定代码
#endif
4.2 配置头文件目录
(1)在 meson.build
中添加全局头文件目录
meson
# 添加系统头文件目录
add_project_arguments('-I/usr/local/custom/include', language: 'c')
# 添加项目内头文件目录
include_dir = include_directories('include', 'src/common')
(2)在特定目标中使用头文件目录
meson
executable('myapp',
'src/main.c',
include_directories: include_dir, # 项目内头文件
c_args: ['-I/opt/thirdparty/include']) # 额外头文件目录
4.3 配置库目录
(1)添加库搜索路径
meson
# 全局库目录
add_project_link_arguments('-L/opt/custom/libs', language: 'c')
# 特定目标的库目录
executable('myapp',
'src/main.c',
link_args: ['-L/opt/thirdparty/libs'])
(2)指定库依赖
meson
# 查找系统库
zlib_dep = dependency('zlib')
# 指定自定义库路径
custom_lib = meson.get_compiler('c').find_library('custom',
dirs: ['/opt/libs', '/usr/local/custom/libs'])
executable('myapp',
'src/main.c',
dependencies: [zlib_dep, custom_lib])
4.4 控制静态库/动态库
(1)生成库类型控制
meson
# 默认库类型(可在 meson_options.txt 配置)
default_library_type = get_option('default_library')
# 生成库
mylib = library('mylib',
'src/lib.c',
install: true,
version: '1.0.0',
soversion: '1',
darwin_versions: ['1.0.0'],
build_by_default: true,
# 控制库类型:
# 'static':静态库
# 'shared':动态库
# 'both':同时生成
# 'none':不生成(仅用于内部链接)
buildtype: default_library_type)
(2)通过配置选项控制
在 meson_options.txt
中:
ini
option('default_library',
type: 'combo',
choices: ['static', 'shared', 'both'],
value: 'shared',
description: 'Build static or shared library')
构建时指定:
bash
meson setup builddir -Ddefault_library=static
4.5 完整配置示例
myproject/
├── meson.build
├── meson_options.txt
├── include/
│ └── mylib.h
├── src/
│ ├── main.c
│ └── lib.c
└── cross/
└── arm_linux.txt
meson_options.txt
ini
option('default_library',
type: 'combo',
choices: ['static', 'shared', 'both'],
value: 'shared')
option('enable_debug',
type: 'boolean',
value: false,
description: 'Enable debug symbols')
meson.build
meson
project('myproject', 'c',
version: '1.0.0',
default_options: ['warning_level=3', 'c_std=c11'])
# 配置选项
default_library_type = get_option('default_library')
enable_debug = get_option('enable_debug')
# 头文件目录
include_dir = include_directories('include')
# 添加第三方库路径
add_project_link_arguments('-L/opt/thirdparty/libs', language: 'c')
# 查找依赖
zlib_dep = dependency('zlib')
pthread_dep = dependency('threads')
# 构建库
mylib = library('mylib',
'src/lib.c',
include_directories: include_dir,
dependencies: [zlib_dep],
buildtype: default_library_type,
install: true)
# 构建可执行文件
executable('myapp',
'src/main.c',
include_directories: include_dir,
link_with: mylib,
dependencies: [pthread_dep],
install: true,
c_args: enable_debug ? ['-g3', '-O0'] : ['-O2'])
# 安装头文件
install_headers('include/mylib.h', subdir: 'myproject')
构建与安装命令
bash
# 标准构建
meson setup builddir -Ddefault_library=static -Denable_debug=true
meson compile -C builddir
# 交叉编译
meson setup arm_build --cross-file cross/arm_linux.txt -Ddefault_library=shared
# 安装
meson install -C builddir --destdir /tmp/install
4.6 高级技巧
- 条件编译:
meson
if meson.get_compiler('c').has_header('openssl/ssl.h')
add_project_arguments('-DHAVE_OPENSSL', language: 'c')
endif
- 自定义工具链标志:
meson
if host_machine.cpu_family() == 'arm'
add_project_arguments('-march=armv7-a', '-mfpu=neon', language: 'c')
endif
- 生成 pkg-config 文件:
meson
pkg = import('pkgconfig')
pkg.generate(
name: 'mylib',
description: 'My custom library',
version: meson.project_version(),
libraries: mylib,
subdirs: 'myproject'
)
-
多后端支持
bashmeson setup builddir --backend=vs # 生成 Visual Studio 解决方案
五、应用场景与对比
-
典型应用案例
- 开源项目:GNOME、DPDK、Mesa3D 等已迁移至 Meson。
- 企业开发:简化跨平台 C/C++ 项目构建,提升 CI/CD 效率。
- 嵌入式系统:灵活支持交叉编译和定制化工具链。
-
对比 CMake
特性 Meson CMake 语法 声明式类 Python,更简洁 自定义脚本,灵活性高 构建速度 ⭐⭐⭐(依赖 Ninja 优化) ⭐⭐(依赖 Make 或 Ninja) 依赖管理 内置 dependency()
自动探测需手动编写 Find 模块 学习曲线 较低(结构化语法) 较陡峭
六、为何 Meson 成为新宠?
⚡ 6.1 性能优势:构建速度与效率的革命
-
极速增量编译
Meson 默认集成 Ninja 后端,其依赖分析算法和并行任务调度能力远超传统 Makefile。例如,在 Git 项目的迁移测试中,Meson+Ninja 的构建速度比 Autotools/CMake 快 30% 以上,尤其在大规模项目中优势显著。对比测试显示,Meson/Ninja 在多核环境下编译时间与直接使用 Ninja 几乎持平,而 CMake(生成 Ninja 或 Makefile)因额外生成步骤拖慢整体流程。
-
源外构建与多配置支持
Meson 强制 源码与构建目录分离,避免污染源码,同时支持单源码目录下并行维护 Debug/Release/交叉编译等多种配置,大幅简化多环境开发流程。
🧩 6.2 语法现代化:降低维护成本
-
声明式配置 vs 脚本式逻辑
Meson 采用 类 Python 的声明式语法 (如
executable('app', 'main.c', dependencies: zlib_dep)
),对比 Autotools 的宏扩展或 CMake 的自定义脚本,可读性和可维护性显著提升。HarfBuzz 项目迁移后,构建脚本行数减少 60%,且依赖关系显式声明,无需手动处理头文件路径等细节。 -
内建依赖管理
通过
dependency()
函数自动查找系统库(如 OpenGL、Zlib),支持跨平台统一配置。DPDK 项目利用此特性简化了 NUMA 库等复杂依赖的集成。未来版本(1.8.0)还将支持 子项目独立构建类型(如第三方库用 Release,主项目用 Debug),解决混合构建场景的痛点。
🌐 6.3 全平台支持:拥抱异构开发生态
-
原生跨平台能力
Meson 无需额外适配即可在 Linux/macOS/Windows 生成统一构建配置,且深度集成 Visual Studio 和 Xcode 后端。Git 项目迁移后,Windows 开发者的环境配置时间减少 70%。
-
嵌入式与交叉编译友好
通过 Cross File 配置文件支持嵌入式工具链(如 RISC-V、ARM),DPDK 利用此特性实现同一套配置编译 x86 服务器和嵌入式网卡驱动。Meson 1.2 更扩展了对 Metrowerks 编译器(PowerPC/ARM)的实验性支持。
🔗 6.4 生态融合:与现代工具链无缝协作
-
IDE 与工具集成
生成
compile_commands.json
支持 Clangd/LSP 代码跳转,且原生适配 GitLab CI 等流水线工具。HarfBuzz 迁移后,开发者可直接在 VS Code 中调试构建问题。 -
标准化构建流程
命令集高度统一(
meson setup
→meson compile
→meson test
),降低学习成本。对比 Autotools 的./configure && make
,Meson 屏蔽了平台差异,用户无需记忆不同系统的命令变体。
📈 6.5 社区推力:头部项目的示范效应
- 关键项目迁移案例 :
Git (2.48+)、GNOME/GTK、DPDK (20.11+)、HarfBuzz (9.0+) 等重量级项目全面转向 Meson,验证了其在大规模 C/C++ 项目中的可靠性。 - 问题驱动改进:社区反馈推动功能迭代,例如子项目独立构建类型的需求已被纳入 1.8.0 路线图。
能力维度 | Autotools | CMake | Meson |
---|---|---|---|
构建速度 | 慢(依赖 Make) | 中等(依赖后端) | ⭐⭐⭐(Ninja 优化) |
语法简洁性 | 复杂(Shell 宏) | 灵活但晦涩 | ⭐⭐⭐(声明式 Python 风) |
跨平台一致性 | 仅 Unix-like | 支持但需手动适配 | ⭐⭐⭐(全平台原生) |
依赖管理 | 手动编写 m4 脚本 | 需 Find 模块 | ⭐⭐(内建 dependency() ) |
学习曲线 | 陡峭 | 陡峭 | ⭐(平缓) |
Meson 的崛起本质是对构建系统本质的重新思考:它以性能为基石,以开发者体验为轴心,通过约束设计(如强制源外构建)换取可靠性和一致性。随着 C++20/23 等新标准普及和跨平台需求激增,Meson 的现代化设计将成为更多项目的理性选择。
七、学习建议与资源
-
入门路径
- 基础:掌握
meson.build
语法结构,实践单文件项目编译。 - 进阶:学习多模块项目、依赖管理与交叉编译。
- 高级:阅读开源项目(如 GLib)构建配置。
- 基础:掌握
-
官方资源
- Meson 官网:完整文档与教程。
- GitHub 示例:Meson 示例项目。
-
调试技巧
- 查看构建选项:
meson configure builddir
。 - 详细编译日志:
meson compile -C builddir --verbose
。
- 查看构建选项:
💎 总结 :Meson 以速度 和可读性为核心优势,适合现代 C/C++ 项目。从简单脚本到大型跨平台工程,其模块化设计和丰富功能可显著提升开发效率。