如果您不熟悉 CMake,可能需要先阅读 CMake 的”Using Dependencies Guide”
SDK 源代码在哪里?
执行事件 C SDK 位于与执行层守护进程相同的源代码仓库中(此处),在子目录category/event 下。它有一个单独的 CMakeLists.txt 文件,可作为顶层项目文件,因此用户不需要构建完整的执行项目即可编译它。
SDK 的构建系统会生成一个名为 libmonad_event.a 的库,如果您更喜欢共享库则生成 libmonad_event.so。您还需要公共头文件。
我的代码如何使用 libmonad_event.a?
以下是三种不同的选择:
- 预编译库 - 您可以自己构建库并将库文件(及其头文件)存储在某处,然后手动将其导入您的构建系统。如果您也使用 CMake,SDK 构建系统还会创建一个 CMake “config” 文件供
find_package使用,以帮助导入
- CMake 子项目集成 - 您的 CMake 项目可以将 SDK 作为子项目包含。这种情况下,您在自己的项目中下载执行仓库的源代码,然后调用 CMake 函数:
这将把 SDK 的库目标(名为
monad_event)添加到您的父 CMake 项目中。将 SDK 代码添加到您的构建中的一种方式是使用 git submodule。另一种方式是使用 CMake 的FetchContent模块。这些方法之间的三个主要区别是:- 默认情况下,
FetchContent会在构建配置时将 git 仓库克隆到您的 CMake 构建树中,而 git submodule 在仓库级别集成到您的源代码树中 - 使用
FetchContent时,您检出的版本由您在CMakeLists.txt文件中指定的GIT_TAG决定;对于git submodule,则通过 git 命令管理 - 如果您获取的内容有自己的 CMake 构建系统(如 C SDK),
FetchContent会自动调用add_subdirectory将其添加到当前项目;在 git submodule 方式中,您需要手动执行此操作
- 默认情况下,
- CMake
ExternalProject集成 - CMake 的ExternalProject模块类似于FetchContent,但更加隔离;它会将 SDK 构建和安装到 CMake 构建树中的”暂存”目录。这使用完全独立的 CMake 调用,因此不会将 SDK 的 CMake 项目添加到您自己的项目中。这意味着,例如,您的 CMake 项目中不会自动拥有monad_event库目标 —— 您需要将其创建为导入目标。ExternalProject有助于将您的构建系统与 SDK 的构建系统隔离,确保 SDK 的 CMake 配置和变量不会”泄漏”到父项目中
FetchContent 方法。它将整个过程封装为一个简单的、一站式的 CMakeLists.txt 文件,并且我们在该文件中添加了注释以解释您需要了解的一切。
对于我们的小型”开始使用”示例程序来说,这显然是最佳选择,但对于您的实际项目可能并不是最佳。本指南末尾简要展示了使用 find_package 的替代方法。
使用 FetchContent 构建示例程序
步骤 1:安装前置开发包
除 CMake(至少 3.23 版本)和 git 外,我们还需要较新的 C 编译器和两个第三方库。我们还将使用 curl 下载一些文件。必需的 C 编译器
C SDK 使用了 C23 的一些较新特性,需要 gcc-13 或 clang-19。如果 CMake 找到的默认编译器过旧,您需要通过设置CC 环境变量或使用 CMake 工具链文件指定备用 C 编译器。
CMake 选择的默认编译器通常是 cc -v 命令报告的那个。如果您需要使用不同的编译器,可以使用 bash 语法 VAR=VALUE <command> 在下一个命令的作用域中设置环境变量,例如:
必需的 C++ 编译器
本示例中未使用 C++,但 CMake 项目中有一些可选的 C++ 组件。因此,您必须安装 C++ 编译器,否则 CMake 配置步骤将失败。SDK 是用纯 C 编写的,但包含一些 C++ 头文件,可用于使用
<format> 库对事件类型进行”美化打印”。这些不是示例程序的一部分,它们需要完整的 C++23 范围格式化支持(__cpp_lib_format_ranges 特性测试宏),这一支持在 gcc 15.2 版本的 libstdc++ 中添加。这是一个较新的版本:gcc 15.2 首次出现在 Ubuntu 软件包仓库中是在 Ubuntu 25.10。您也可以使用 clang 配合 libc++(LLVM 的 C++ 标准库实现),从版本 19 开始它就有范围格式化支持。在”开始使用”指南的可选最后步骤中,展示了使用 clang-19 构建 C++ 程序的示例,用于构建 monad-event-cli 实用工具。必需的第三方库
libzstd 是硬性依赖;libhugetlbfs 在 Linux 上默认预期存在但可选。可通过将 CMake 选项 MONAD_EVENT_USE_LIBHUGETLBFS 设置为 OFF 手动关闭。
macOS 兼容性
实时数据需要 Linux 主机(因为执行层守护进程本身需要),但您可以在 macOS 上编译并运行处理历史数据的示例程序。这允许您在花费精力在 Linux 上搭建 Monad 节点之前”先试后买”并探索 SDK。 在这种情况下,您不需要libhugetlbfs(这是仅 Linux 的库),但您需要较新的 XCode 工具链、libzstd 压缩库和 CMake。后两者不包含在默认的 XCode 开发工具中,因此您可能希望使用 Homebrew 或 MacPorts 将其安装到系统上。至于 XCode 本身,自 16.3 版本以来的任何版本都应该可以工作,但仅使用 23.2 版本进行过测试(实际要求是 Apple Clang 17)。1
步骤 2:下载示例程序
首先,创建一个新目录并将示例程序源文件下载到其中。我们将使用示例目录~/src/event-sdk-example-c
eventwatch.c 的文件。
步骤 3:添加 CMakeLists.txt 构建文件
在 eventwatch.c 旁边的目录中创建 CMakeLists.txt 文件,并将以下内容复制到其中:
步骤 4:运行 CMake 并构建
使用 make 和默认编译器运行 CMake:
使用 ninja 和替代编译器运行 CMake:
以下是另一种可能的调用方式,它使用 CC 环境变量设置替代 C 编译器并使用 Ninja 构建工具:
eventwatch 的可执行文件。尝试使用 -h 标志运行它以打印帮助。
#[derive(Debug)] 属性,Rust 示例程序打印的输出比 C 版本更有趣,因此 Rust 中的”开始使用”体验更好。您可以通过使用前述的 std::formatter 特化在 C++ 中做等价的事,但它们不在教程中。
您也可以继续本页的下一节,其中展示了与 C 库集成的另一种方式。
替代方法:本地安装,使用 find_package 查找
现在您已经看过了”一站式”教程,它解释了源代码组织、SDK 的 CMakeLists.txt 文件所在位置等,我们可以更简洁地展示另一种构建系统。本节中我们将:
- 将 SDK 安装到临时目录
/tmp/sdk-install-demo,它将具有传统的include和lib目录结构,还有一个包含 CMakefind_package配置文件的lib/cmake/category-labs目录 - 再次编译
eventwatch.c,这次使用find_package,它将被指示在/tmp/sdk-install-demo中查找
步骤 1:构建并安装 libmonad_event.a
/tmp/sdk-install-demo 目录。
步骤 2:创建新目录并下载 eventwatch.c
步骤 3:创建 CMakeLists.txt
添加一个带有以下内容的 CMakeLists.txt 文件:

