如何使用Meson和Ninja构建c++项目 更快更简单的构建系统【工程化】

Meson+Ninja构建C++项目更快更简洁:Meson声明式描述逻辑,Ninja极速执行,编译速度比CMake+Make快2–3倍,配置代码减少约40%。

用 Meson + Ninja 构建 C++ 项目,确实比传统 Makefile 或 CMake 更快、更简洁。核心在于:Meson 负责声明式描述构建逻辑(易读易维护),Ninja 负责极速执行(依赖精准、并行高效)。两者组合,编译速度常比 CMake+Make 快 2–3 倍,且配置代码量减少约 40%。

一、安装与最小项目结构

Meson 是 Python 工具,Ninja 是独立二进制,均推荐用系统包管理器安装:

  • macOS:brew install meson ninja
  • Ubuntu/Debian:sudo apt install meson ninja-build
  • Windows(MSVC):用 pip install meson + 下载 Ninja 官方 Windows 二进制并加入 PATH

项目目录建议这样组织:

myapp/
├── meson.build          # Meson 入口文件(必需)
├── src/
│   ├── main.cpp
│   └── utils.cpp
└── include/
    └── utils.hpp

二、写一个清晰的 meson.build

不用写规则、不操心编译器标志顺序——Meson 自动处理跨平台细节。下面是一个典型 C++17 可执行程序配置:

立即学习“C++免费学习笔记(深入)”;

project('myapp', 'cpp', version: '0.1.0', default_options: ['cpp_std=gnu++17'])

声明可执行目标

exe = executable( 'myapp', sources: [ 'src/main.cpp', 'src/utils.cpp' ], include_directories: include_directories('include'), dependencies: dependency('threads'), # 自动找 pthread 或 Windows 线程库 )

可选:加单元测试

test('basic', exe, args: ['--test'])

关键点:

  • project() 第一次调用即定义整个项目,自动检测编译器和基础工具链
  • include_directories() 支持相对路径,Meson 会自动转为 -I 参数
  • 依赖用 dependency() 声明,Meson 在 pkg-config、CMake、系统路径中自动查找

三、构建流程:两步完成,无中间脚本

完全跳过 configure/make 的繁琐步骤,直接:

# 1. 生成 Ninja 构建文件(只运行一次,或修改 meson.build 后重做)
meson setup builddir

2. 编译(支持增量、并行、静默)

ninja -C builddir

3. 运行(路径固定,无需 cd)

./builddir/myapp

Ninja 默认启用所有 CPU 核心并行,且只重新编译被修改或依赖变更的文件。首次构建后,改一个 .cpp 文件,通常 1 秒内完成重编。

四、常用工程化技巧

实际项目中,这些写法能显著提升可维护性:

  • 条件编译:用 get_option('build_tests') 配合 meson configure -Dbuild_tests=true builddir
  • 子项目复用:在 subprojects/ 放第三方库(如 fmt、catch2),Meson 自动识别 meson.build 并内联构建
  • IDE 支持:VS Code 安装 “Meson” 插件,或用 meson setup builddir --ide=vscode 生成配置
  • 交叉编译:写 cross-file.txt 描述目标平台,再 meson setup builddir --cross-file cross-file.txt

Meson 内置对 sanitizer、coverage、PCH、CUDA 的支持,无需手动拼接 flag —— 比如开 ASan,只需 meson setup builddir -Db_sanitize=address