其他
用 Meson 构建 C/C++ 项目:配置、依赖…
在 C/C++ 项目中搭建/配置 Meson 构建、管理依赖、交叉编译或从 CMake/Autotools 迁移时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 57/100 ×0.15
适用场景
用 Meson 构建 C/C++ 项目:通用
解决思路
- 用 `meson setup builddir` 配置项目;source-dir 与 build-dir 是位置参数。
- 带选项配置:`meson setup builddir --buildtype=release --prefix=/usr/local -Db_lto=true -Db_sanitize=address`。
- 重新配置已存在的 builddir:`meson configure builddir -Dbuildtype=debug`;用 `meson configure builddir` 查看全部可用选项。
- 按需选择 `--buildtype`:`debug`(默认,等价 `-O0 -g`)、`debugoptimized`(`-O2 -g`)、`release`(`-O3 -DNDEBUG`)、`minsize`(`-Os -DNDEBUG`)、`plain`(不添加任何标志)。
- 构建:在源码目录执行 `meson compile -C builddir`,或 `cd builddir && ninja` 直接调用 Ninja 后端。
- 测试:`meson test -C builddir`;`--verbose` 显示测试输出;`-t 5` 设置 5 倍超时;`--suite unit` 只运行 `unit` 套件。
- 安装:`meson install -C builddir`;用 `meson install -C builddir --dry-run` 做试运行。
- 在 `meson.build` 中用 `project()` 声明项目:名称、语言、`version`,以及 `default_options`(如 `c_std=c11`、`cpp_std=c++17`、`warning_level=2`)。
- 用 `dependency('glib-2.0', version : '>=2.68')` 查找系统依赖,用 `dependency('threads')` 获取线程库。
- 用 `include_directories('include')` 定义头文件目录,并把它传给目标。
- 用 `static_library('mylib', sources : [...], include_directories : inc)` 构建库。
- 用 `executable('myapp', sources : [...], include_directories : inc, link_with : mylib, dependencies : [glib_dep, threads_dep], install : true)` 构建可执行文件。
- 用 `test('basic', executable('test_basic', sources : [...], link_with : mylib))` 注册测试。
- wrap 操作:`meson wrap search zlib` 搜索;`meson wrap install zlib` / `meson wrap install gtest` 安装(从 wrapdb 下载 .wrap 文件);`meson wrap list` 列出已安装;`meson wrap update` 更新全部。
- 在 `meson.build` 中给 `dependency()` 加 `fallback : ['zlib', 'zlib_dep']`,格式为 `[wrap 名, 依赖变量名]`,系统库找不到时回退到 wrap。
- 需要可复现构建时,在 `dependency()` 的 fallback 之外再加 `default_options : ['default_library=static']`,强制使用 wrap。
- 编写 `subprojects/zlib.wrap`:[wrap-file] 段填 `directory`、`source_url`、`source_hash`(sha256);[provide] 段填 `zlib = zlib_dep`。
- 在 `meson_options.txt`(Meson ≥1.1 可用 `meson.options`)中用 `option()` 定义选项:`type : 'boolean'`(如 with_tests)、`type : 'combo'`(配 `choices : ['opengl','vulkan','software']`)、`type : 'integer'`(配 `min`/`max`/`value`),并写 `description`。
- 在 `meson.build` 中用 `get_option('with_tests')` 读取选项并控制构建,例如 `if get_option('with_tests')` → `subdir('tests')` → `endif`。
- 交叉编译:创建交叉文件如 `cross/arm-linux.ini`,`[binaries]` 填 `c`、`cpp`、`ar`、`strip`、`pkgconfig`,`[properties]` 填 `sys_root`,`[host_machine]` 填 `system`、`cpu_family`、`cpu`、`endian`。
- 执行交叉编译:`meson setup builddir-arm --cross-file cross/arm-linux.ini`,然后 `meson compile -C builddir-arm`。
- 从 CMake 迁移时按对照表替换:`add_executable`→`executable()`;`add_library`→`library()`/`static_library()`/`shared_library()`;`target_include_directories`→目标中的 `include_directories` 参数;`target_link_libraries`→`dependencies`/`link_with`;`find_package`→`dependency()`;`option()`→`meson_options.txt` 中的 `option()`;`add_subdirectory`→`subdir()`;`install(TARGETS ...)`→目标中的 `install : true`。
适用边界 · 注意事项
- 项目必须使用或更偏好 CMake / Autotools,且没有迁移到 Meson 的计划时。
- 交叉编译器工具链本身尚未配置好时——需先用专门的交叉编译工具链技能准备编译器。
- 目标环境无法安装 Meson 与 Ninja(受限或完全离线的构建环境)时。