ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Meson 深度实战教程:从零构建一个含单元测试、依赖链接与安装发布的 C++11 共享库项目

Meson 深度实战教程:从零构建一个含单元测试、依赖链接与安装发布的 C++11 共享库项目 构建工具【免费下载链接】mesonThe Meson Build System项目地址https://gitcode.com/gh_mirrors/me/meson点击查看免费下载导读本教程以 Meson 构建系统官方文档 IndepthTutorial.md 为骨架完整演示如何用 Meson 搭建一个包含**多个构建目标shared library、executable、单元测试、外部依赖GLib以及安装/发布install headers pkg-config 文件**的真实项目。读完本文你将掌握project、dependency、add_global_arguments、include_directories、subdir、shared_library、test等核心函数的标准用法并能独立完成meson setup → meson compile → meson test → meson install的完整交付流程。同时文章会深入对应源码interpreter.py、pkgconfig.py说明这些声明式语句在 Meson 底层是如何被解析与执行的。项目总览目标与目录结构本教程要构建的主产品是一个名为foo的共享库shared library使用C11编写内容本身并不重要——从构建定义的角度看我们只关心如何声明目标。库依赖外部库GLib因此需要正确检测它并把对应的编译、链接参数带入构建最终我们还要让这个库可安装installable包括头文件安装与 pkg-config 文件生成以便下游项目通过pkg-config消费它。源树source tree包含三个子目录职责分明项目根目录/ ├── include/ # 头文件foolib.h ├── src/ # 库源码source1.cpp、source2.cpp └── test/ # 单元测试footest.cpp每个子目录各自携带一个meson.build文件由顶层meson.build通过subdir()依次进入并执行。顶层 meson.build项目的入口定义整个构建定义总是以project()函数调用开始下面是本教程的顶层 meson.build 完整示例project(c foolib, cpp, version : 1.0.0, license : MIT) add_global_arguments(-DSOME_TOKENvalue, language : cpp) glib_dep dependency(glib-2.0) inc include_directories(include) subdir(include) subdir(src) subdir(test) pkg_mod import(pkgconfig) pkg_mod.generate(libraries : foolib, version : 1.0, name : libfoobar, filebase : foobar, description : A Library to barnicate your foos.)逐行拆解如下。1. project()声明项目名、语言与元信息project的前两个位置参数是项目名与编程语言此处语言只写了cppC。此外还可以通过关键字参数补充元信息version : 1.0.0——项目版本license : MIT——项目许可证。从源码结构看project()会在解释器初始化阶段完成构建目录的创建、默认选项的装载与工具链的检测见 mesonmain.py、coredata.py是整个构建会话的起点。2. dependency()检测外部依赖GLibglib_dep dependency(glib-2.0)dependency函数负责查找外部库默认走pkg-config探测路径对应 pkgconfig.py。如果找不到Meson 会直接报错并停止处理构建定义而不是静默通过——这正是尽早失败的设计哲学。查到的结果以 dependency 对象存入变量glib_dep之后通过关键字参数dependencies :传给目标即可。该函数的解析入口位于 interpreter.py 的func_dependency它会综合 pkg-config、CMake 与内置依赖工厂factory.py多种探测机制。3. add_global_arguments()全局编译器参数add_global_arguments(-DSOME_TOKENvalue, language : cpp)该参数会作用于所有 C 源文件的编译。这里有两个要点它是全局的无法针对某个 target 取消之所以如此设计是因为如果全局设置随目标变化将难以追踪每个编译单元实际使用了哪些编译器标志。底层实现见 interpreter.py 的func_add_global_arguments它把参数写入构建配置中的全局参数列表在后续所有编译命令中统一展开。4. include_directories()头文件搜索路径对象inc include_directories(include)include目录存放库的头文件因此需要让编译命令加上该目录。include_directories返回一个目录对象存入变量inc之后在src、test两个子目录的构建文件中反复复用。该函数实现位于 interpreter.py返回的对象会被转换为对应编译器前端mixins的-I类参数。5. subdir()进入子目录执行其 meson.buildsubdir(include) subdir(src) subdir(test)subdir指示 Meson 进入指定目录、打开其中的meson.build并执行之后返回顶层继续。底层实现func_subdirinterpreter.py会做一系列合法性校验例如路径中不得包含..Subdir contains ..参数必须是相对路径同一目录不能重复进入Tried to enter directory ... already been visited顶层目录不能直接subdir(subprojects)且meson-前缀为保留字。从源码可推断subdir的核心机制是把子目录的meson.build解析成 AST 后并入当前解释上下文因此子文件中定义的变量如foolib在返回顶层后依然可见——这正是后面 pkg-config 生成语句能直接引用foolib的原因。include/meson.build安装头文件install_headers(foolib.h)这一行把头文件安装到系统的头文件目录默认位置为/install prefix/include可通过命令行参数如--includedir覆盖。源码层面func_install_headersinterpreter.py还支持若干进阶关键字本文顺带补充subdir在 include 目录下再建子目录例如subdir : foo安装到include/foo/install_dir自定义安装目录与subdir互斥同时给出会抛异常install_mode0.47.0 起、install_tag1.11.0 起控制安装权限与安装标签preserve_path按源目录相对结构保留子路径。src/meson.build声明共享库目标foo_sources [source1.cpp, source2.cpp] foolib shared_library(foo, foo_sources, include_directories : inc, dependencies : glib_dep, install : true)这里完成三件事用shared_library(foo, ...)构建名为foo的共享库源文件列表来自变量foo_sources通过include_directories : inc复用顶层定义的include目录对象通过dependencies : glib_dep把 GLib 的编译/链接标志全部带入——无需手动拼写任何-l、-I参数。install : true表示安装产物与头文件类似共享库默认安装到/install prefix/lib可覆盖。库对象存入变量foolib供test子目录链接使用。func_shared_libinterpreter.py最终走统一的build_target流程生成对应后端的构建描述Ninja、VS 或 Xcode 后端见 backend 目录。同样地executable、static_library、both_libraries也都汇聚到这一核心流程interpreter.py 起。test/meson.build可执行目标与单元测试testexe executable(testexe, footest.cpp, include_directories : inc, link_with : foolib) test(foolib test, testexe)第一段声明一个测试可执行文件testexe头文件搜索路径与主库保持一致复用inc通过link_with : foolib链接刚构建的共享库。需要注意这里不需要重复声明glib_dep也能正确使用foolib——因为 GLib 的链接标志已随库目标传递只有当可执行文件自己直接使用 GLib 的 API 时才需要再次以dependencies : glib_dep形式添加。第二段用test(foolib test, testexe)注册一个名为foolib test的测试它运行刚构建的二进制退出码为 0 视为通过非零视为失败。注册入口见 interpreter.py 的func_test其底层make_test还支持should_fail/expected_fail预期失败、suite测试分组、args传给测试程序的参数、timeout等进阶选项。生成 pkg-config 文件让库可被下游消费回到顶层文件中被暂时跳过的末尾段落pkg_mod import(pkgconfig) pkg_mod.generate(libraries : foolib, version : 1.0, name : libfoobar, filebase : foobar, description : A Library to barnicate your foos.)所有共享库都应当提供 pkg-config 文件以说明该库如何使用。Meson 内置的 pkgconfig 模块提供了简单的生成器足以覆盖大多数简单项目更复杂的用户可以用 Meson 的 configuration file generator 系统 手写.pc.in模板。参数含义libraries : foolib——关联的库目标生成Libs:与Cflags:所需信息version——.pc文件中的版本号name——pkg-config 包显示名filebase——生成的.pc文件基名此处生成foobar.pcdescription——包描述。从 pkgconfig.py 的generate实现看它的行为远不止拼字符串若version未显式给出会回退到project()声明的项目版本源码中default_version state.project_version除libraries外还支持libraries_private私有链接库进入Libs.private、requires/requires_private依赖包进入Requires:段、extra_cflags/cflags_private附加编译参数、variables自定义变量等关键字会自动额外生成一份foobar-uninstalled.pc供开发树未安装场景使用dataonly模式1.x 引入可生成不含链接信息的纯数据.pc文件默认安装到/{libdir}/pkgconfigFreeBSD 为libdata/pkgconfigHaiku 为develop/lib/pkgconfig见源码第 810-819 行的平台分支。完整工作流配置、编译、测试与安装在源码树根目录依次执行以下命令即可完成全部交付$ meson setup builddir cd builddir $ meson compile $ meson testmeson setup builddir——创建构建目录builddir并完成配置依赖检测、工具链探测、生成后端构建文件完成后需cd builddir后续命令都在构建目录内执行meson compile——按生成的后端文件实际编译等价于在对应后端下运行构建meson test——运行全部已注册的测试输出每个测试的通过/失败状态。安装项目只需一条命令$ meson install它会把头文件、共享库与生成的foobar.pc安装到配置阶段确定的前缀目录下默认/usr/local可用meson setup builddir --prefix路径调整。小结通过四个meson.build文件本教程完成了一个完整 C 项目的构建闭环文件职责关键语句顶层meson.build项目声明、依赖检测、全局参数、子目录编排、pkg-config 生成project、dependency、add_global_arguments、include_directories、subdir、pkg_mod.generateinclude/meson.build安装公共头文件install_headerssrc/meson.build构建可安装的共享库shared_librarytest/meson.build构建测试可执行文件并注册测试executable、test这些声明式语句在 Meson 解释器interpreter.py中逐一被执行并转成后端构建描述pkg-config生成、依赖探测等则由 pkgconfig.py 与 pkgconfig.py 承载。读者可参照本文骨架将foo替换为自己的库名、语言与依赖即可快速搭出带测试、可安装、可发布的生产级 Meson 工程。赞分享构建工具【免费下载链接】mesonThe Meson Build System项目地址https://gitcode.com/gh_mirrors/me/meson点击查看免费下载相关推荐fduthesis高级技巧封面、声明页、目录的完美定制方案fduthesis高级技巧封面、声明页、目录的完美定制方案 fduthesis是复旦大学官方推荐的LaTeX论文模板为复旦学子提供了专业的论文排版解决方案。Milvus 开发环境搭建与测试实战从依赖安装、源码构建到单测与覆盖率Milvus 开发环境搭建与测试实战从依赖安装、源码构建到单测与覆盖率 Milvus 采用 Go C 混合架构本地开发涉及编译器、CMake、Con数据库向量数据库分布式数据库后端Zstandard 的 Meson 构建系统从零配置到构建安装与测试Zstandard 的 Meson 构建系统从零配置到构建安装与测试 导读 本文以 Zstandard 仓库中的 build/meson/README.md数据工程上一篇Deepin升级工具定时任务使用systemd服务实现自动检查更新下一篇dim_gen_baseline命令完全指南openEuler DIM工具使用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表