在 【eBPF 入门实践教程十二:使用 eBPF 程序 profile 进行性能分析】 这篇文章中, profiler 工具的实现是使用了 rust 编写的 blazesym 库,而我现在打算使用 C++ 实现,还好这个库提供了 C API,但是需要我们将这个 Rust 库的构建集成到 CMake 中。
Corrosion 可将 Rust 集成到现有 CMake 项目中,它是一个 CMake 工具链,旨在让 CMake 像对待原生 C++ 子项目一样对待 Rust 的 Cargo 项目。Corrosion 将手动调用 cargo build,处理复杂的跨平台路径、构建配置(Debug/Release)以及繁琐的链接参数这些过程完全自动化了。
Corrosion 的核心功能
Corrosion 的工作原理是在 CMake 层面为 Cargo 包装了一层“外壳”,其主要功能包括:
- 自动处理构建类型:CMake 的
Release或Debug模式会自动映射到 Cargo 的--release或默认模式。 - 目标导入:将 Rust 的
staticlib或cdylib导入为标准的 CMake 目标(Targets),你可以直接对它们使用target_link_libraries。 - 跨平台交叉编译:它能自动将 CMake 的交叉编译设置(如 Android, iOS, 嵌入式等)传递给 Rust 的目标三元组(Target Triple)。
- 多包支持:支持 Cargo 工作区(Workspaces)和单个 Crate。
项目结构
在我的项目 profiler 中使用 Corrosion 时,项目布局如下:
| |
如何在 CMake 中使用 Corrosion
(1)通过 FetchContent 自动下载并集成
| |
(2)导入 Rust 项目
| |
(3)配置静态库
在 blazesym 的 C API 构建时,文档中说明了需要链接的 C 库:
| |
为了方便后面的构建目标使用 blazesym 库,我的做法是将其制作的静态库和头文件“打包”,方便构建目标通过 target_link_libraries 使用:
| |
(4)使用静态库
可以将刚刚的三步的代码合并成一个 cmake 文件中放在项目根目录下的 cmake 目录中(例如我这里的 cmake/SetupBlazesym.cmake),然后在项目的 CMakelists.txt 中 通过 include 使用:
| |