构建编译系统-meson
简述
Meson 是一个现代化、高性能、用户友好的构建系统(build system),旨在替代传统的 Autotools 和 CMake。它使用一种简洁、声明式的 DSL(领域特定语言)来描述构建逻辑,语法清晰,易于阅读和维护,并且原生支持并行构建、跨平台编译、测试集成等特性。
安装
Linux(Ubuntu/Debian)
cpp
sudo apt install meson ninja-build
macOS(使用 Homebrew)
cpp
brew install meson ninja
Windows
cpp
pip install meson ninja
基本概念
- meson.build:项目根目录下的主构建脚本(类似 CMakeLists.txt)。
- 源码树(source tree):存放源代码。
- 构建目录(build directory):独立于源码的输出目录(强制 out-of-source 构建)。
- 后端(backend):默认是 Ninja,也可生成 VS/Xcode 项目。
基本流程
- 创建编写源码文件;
- 创建编写meson.build构建文件
- $ meson setup builder # 配置项目
- $ ninja -C builder # 编译(或者meson compile -C builder)
- $ ./builder/hello # 运行
简单示例
创建并编辑main.c和meson.build文件:

main.c
cpp
#include <stdio.h>
int main(int argc, char**argv)
{
printf("meson.build demo1\n");
return 0;
}
meson.build
cpp
project('demo1', 'c')
executable('demo1', 'main.c')
执行命令:
$ meson setup build
$ ninja -C build
$ ./build/demo1

或者
$ meson setup build && cd build
$ meson compile
$ ./demo1
核心语法与功能详解
项目声明
cpp
project(
'myproject', # 工程名称
['c', 'cpp'], # 支持的语言
version: '1.0.0', # 版本号
default_options: [ # 默认选项
'warning_level=3',
'c_std=c11',
'cpp_std=c++17'
]
)
生成目标
- executable():可执行文件
- static_library():静态库
- shared_library():动态库
bash
# 可执行文件
exe = executable('app', 'main.cpp', 'utils.cpp')
# 静态库
lib = static_library('mylib', 'lib.c')
# 共享库
shared_lib = shared_library('mylib', 'lib.c')
依赖管理
内部依赖(子项目)
cpp
mylib = static_library('mylib', 'lib.c')
mydep = declare_dependency(
include_directories: include_directories('.'),
link_with: mylib
)
# 在其他目标中使用
executable('app', 'main.c', dependencies: mydep)
外部依赖(pkg-config / CMake / 系统库)
- 参考1
cpp
# 使用 pkg-config
dep = dependency('openssl')
# 查找可执行程序
python = find_program('python3')
# 使用 CMake 包(如 Qt5)
qt5 = dependency('qt5', modules: ['Core', 'Widgets'])
- 参考2
cpp
project('tutorial', 'c')
gtkdep = dependency('gtk+-3.0')
executable('demo', 'main.c', dependencies : gtkdep)
- 参考3
cpp
gtkdeps = [dependency('gtk+-3.0'), dependency('gtksourceview-3.0')]
编译选项与宏定义
cpp
# 添加编译参数
add_project_arguments('-DDEBUG', language: 'c')
# 定义预处理器宏
conf = configuration_data()
conf.set('VERSION', meson.project_version())
configure_file(
input: 'config.h.in',
output: 'config.h',
configuration: conf
)
# 在源码中包含 config.h 即可使用 #define VERSION "1.0.0"
子目录
cpp
# 根目录 meson.build
subdir('src')
subdir('tests')
在 src/meson.build 中:
cpp
executable('myapp', 'main.c')
在 tests/meson.build 中:
cpp
test('unit-test', executable('test_main', 'test.c'))
运行测试:
$ meson test -C builddir
安装规则
cpp
install_headers('mylib.h')
install_data('README.md', install_dir: get_option('datadir') / 'myapp')
安装到系统:
cpp
ninja -C builddir install # 默认前缀为 /usr/local
# 或指定前缀
meson setup builddir --prefix=/opt/myapp
常用命令
-
$ meson --version : 查看meson版本
-
$ meson setup --help : 参考setup帮助文档,同理也可以查看其他命令帮助
-
$ meson --help :查看帮助

-
初始化构建目录:
$ meson setup builddir
-
查看/修改配置选项:
$ meson configure builddir
-
推荐方式编译(推荐,跨平台):
$ meson compile -C builddir
-
传统方式编译(需安装 ninja):
$ ninja -C builddir
-
运行测试:
$ meson test -C builddir
-
安装产物:
$ meson install -C builddir
-
查看构建目标:
$ meson introspect builddir --targets
交叉编译
交叉编译(Cross Compilation),创建cross-arm.txt:
bash
[binaries]
c = 'arm-linux-gnueabihf-gcc'
cpp = 'arm-linux-gnueabihf-g++'
ar = 'arm-linux-gnueabihf-ar'
[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'armv7'
endian = 'little'
交叉编译命令:
$ meson setup builddir --cross-file cross-arm.txt
依赖管理
Wrap 依赖管理(类似 submodule)
Meson 内置依赖管理器 wrap,可自动下载第三方库(如 zlib、gtest):
$ meson wrap install zlib
然后在 meson.build 中:
$ zlib_dep = dependency('zlib')