尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

FlatBuffers 构建完全指南:CMake / Bazel / Conan / vcpkg 多平台编译与项目集成实战

发布时间:2026/9/11 21:20:20

资讯中心
01
ARTICLE

FlatBuffers 构建完全指南:CMake / Bazel / Conan / vcpkg 多平台编译与项目集成实战

FlatBuffers 构建完全指南:CMake / Bazel / Conan / vcpkg 多平台编译与项目集成实战
FlatBuffers 构建完全指南CMake / Bazel / Conan / vcpkg 多平台编译与项目集成实战【免费下载链接】flatbuffersFlatBuffers: Memory Efficient Serialization Library项目地址: https://gitcode.com/GitHub_Trending/fl/flatbuffers本篇指南围绕 FlatBuffers 官方构建文档docs/source/building.md展开系统讲解如何在本仓库源码的基础上通过 CMake、Bazel、Conan、vcpkg 四种主流方式构建flatc编译器与 C 运行库并覆盖 Android 交叉编译、在自有 CMake 工程中集成 FlatBuffers 以及基于 SLSA3 的二进制产物校验。读完本文你将能够根据平台与依赖管理习惯选择最合适的构建路径并把 FlatBuffers 以源码或预编译二进制的方式接入自己的项目。FlatBuffers 是一个内存高效的跨平台序列化库序列化后的数据可以直接内存映射读取无需先解析、再复制到对象因而在移动端、游戏与高频 I/O 场景中被广泛使用。仓库根目录的 CMakeLists.txt 是整套构建体系的枢纽它同时产出编译器flatc、静态库flatbuffers与测试程序flattests本指南将逐一拆解其背后的配置开关与源码实现。一、构建方式总览一条源码四种入口官方构建文档给出了四条彼此独立、可自由组合的构建路径它们服务于不同的使用场景构建方式适用场景核心产物CMake本地源码编译、跨平台Unix / Windows / macOSflatc、静态库、共享库、flattestsBazel依赖 Bazel 的工程含 gRPC、Swift 支持flatc、flatbuffers库目标Conan通过 Conan 包管理器集成到 C 项目flatbuffers预编译包vcpkg通过 vcpkg 包管理器集成到 C 项目flatbuffers端口安装包四条路径最终都指向同一份 C 源码与同一套.fbsschema 处理流程区别仅在于工程编排与依赖分发的方式。下面按文档顺序逐一深入。二、使用 CMake 构建CMake 是官方指定的主构建系统文档原文“The distribution main build system is configured bycmake”。仓库根目录的 CMakeLists.txt 声明了cmake_minimum_required(VERSION 3.8...3.25.2)即支持 CMake 3.8 至 3.25.2 的版本区间并定义了project(FlatBuffers ... LANGUAGES CXX)因此构建机器上需预先安装符合该版本范围的 CMake 与 C 编译器。2.1 配置阶段GenerateCMake 采用“先生成工程文件、再编译”的两段式流程。文档针对三大平台给出了对应的生成器# Unix / LinuxMakefile 生成器 cmake -G Unix Makefiles -DCMAKE_BUILD_TYPERelease # WindowsVisual Studio 17 2022即 VS2022 cmake -G Visual Studio 17 2022 -DCMAKE_BUILD_TYPERelease # macOSXcode 工程 cmake -G Xcode -DCMAKE_BUILD_TYPERelease其中-G指定生成器-DCMAKE_BUILD_TYPERelease指定优化级别Release 模式。文档特别提示在 Unix 上若希望使用clang而非默认的gcc需要在调用前注入环境变量CC/usr/bin/clang CXX/usr/bin/clang cmake -G Unix Makefiles -DCMAKE_BUILD_TYPEReleaseCC/CXX是 CMake 识别 C/C 编译器的标准环境变量从 CMakeLists.txt 的源码可以看到工程会通过CMAKE_CXX_COMPILER_ID MATCHES Clang判断编译器是否为 Clang并据此启用对应的一组警告选项如-Wimplicit-fallthrough、-Wextra-semi等。配置完成后CMake 会在当前目录生成工程文件Makefile / .sln / .xcodeproj以及compile_commands.json该文件由 CMakeLists.txt 中的CMAKE_EXPORT_COMPILE_COMMANDS ON显式开启方便编辑器与静态分析工具使用。2.2 Strict Mode把警告当错误默认情况下CMake 配置出的目标不会开启“警告即错误”的严格模式例如 GCC/Clang 的-Werror或 MSVC 的/WX。但仓库的 CI 要求代码必须以严格模式编译通过因此提交代码改动前应显式开启该开关cmake -DFLATBUFFERS_STRICT_MODEON从源码看FLATBUFFERS_STRICT_MODE定义于 CMakeLists.txt其说明为“以所有警告作为错误-Werror 或 /WX构建 flatbuffers”。实际生效逻辑位于 CMakeLists.txt 的ProjectConfig接口库中MSVC 系编译器默认/W4开启严格模式时追加/WXGCC/Clang默认-Wall -Wextra -pedantic等开启严格模式时追加-Werror、-fno-rtti并按编译器版本追加-Werrorunused-parameter、-Werrorimplicit-fallthrough2等细粒度规则。由于这些选项通过ProjectConfig接口库以INTERFACE方式传播CMakeLists.txt凡链接到该接口库的目标flatc、flatbuffers、flattests都会一致地继承严格警告策略。2.3 编译阶段Build工程文件生成完毕后按各自平台的常规方式执行编译# Unix make -j # Windows msbuild.exe FlatBuffers.sln # macOS xcodebuild -toolchain clang -configuration Release编译完成后可得到下列关键产物对应 CMakeLists.txt 中的目标定义flatcFlatBuffers schema 编译器可执行文件用于把.fbs生成各语言代码只有当FLATBUFFERS_BUILD_FLATC为 ON 时才构建flatbuffers静态库由 CMakeLists.txt 通过add_library(flatbuffers STATIC ${FlatBuffers_Library_SRCS})定义其头文件目录以INTERFACE方式附着在目标上因此通过target_link_libraries(... flatbuffers)链接即可自动获得 include 路径flatbuffers_shared共享库由FLATBUFFERS_BUILD_SHAREDLIB开关控制默认 OFF其SOVERSION采用完整版本号——源码注释明确说明 FlatBuffers 采用日历版本且不提供 ABI 稳定性保证因此用完整版本作为 SONAME 以避免升级破坏反向依赖CMakeLists.txtflattests测试程序由 CMakeLists.txt 构建并在 CMakeLists.txt 中注册为 CTest 测试add_test(NAME flattests COMMAND flattests)可用ctest一键运行。2.4 常用 CMake 配置选项速查源码级除文档重点强调的FLATBUFFERS_STRICT_MODE外CMakeLists.txt 还定义了大量可调开关均通过-D选项ON/OFF传入选项默认值作用FLATBUFFERS_BUILD_TESTSON构建测试与样例注意若关闭FLATBUFFERS_BUILD_FLATC测试会被自动禁用并给出警告CMakeLists.txtFLATBUFFERS_INSTALLON是否安装目标头文件、库、CMake 配置FLATBUFFERS_BUILD_FLATLIBON构建flatbuffers静态库FLATBUFFERS_BUILD_FLATCON构建flatc编译器FLATBUFFERS_STATIC_FLATCOFF以-static静态链接方式构建flatc非 MSVC 平台生效FLATBUFFERS_BUILD_FLATHASHOFF构建flathash哈希工具FLATBUFFERS_BUILD_BENCHMARKSOFF构建基准测试对应 benchmarks/ 目录FLATBUFFERS_BUILD_GRPCTESTOFF构建 gRPC 测试需预先设置GRPC_INSTALL_PATH与PROTOBUF_DOWNLOAD_PATHCMakeLists.txtFLATBUFFERS_BUILD_SHAREDLIBOFF构建共享库FLATBUFFERS_CODE_COVERAGEOFF代码覆盖率仅 Linux/macOSFLATBUFFERS_CODE_SANITIZEOFF为flatc/flattests追加-fsanitize如address,undefined仅 Linux/macOSFLATBUFFERS_BUILD_CPP17OFF构建 C17 测试目标要求 Clang6/GCC7/MSVC2017 及以上FLATBUFFERS_ENABLE_PCHOFF启用预编译头需 CMake ≥ 3.16以加速编译FLATBUFFERS_PACKAGE_DEBIAN/FLATBUFFERS_PACKAGE_REDHATOFF通过 CPack 生成 deb / rpm 安装包仅 Unix对应 CMake/PackageDebian.cmake 与 CMake/PackageRedhat.cmake另有非布尔类变量FLATBUFFERS_CPP_STD默认 11决定cxx_std_*编译特性、FLATBUFFERS_CXX_FLAGS追加自定义编译选项见 CMakeLists.txt、FLATBUFFERS_FLATC_EXECUTABLE指定外部 flatc 路径以跳过本工程编译见 CMakeLists.txt。三、使用 Bazel 构建对于 Bazel 工程仓库根目录的 BUILD.bazel 与 MODULE.bazel 提供了完整的构建定义。文档推荐使用 Bazelisk 管理 Bazel 版本环境若要启用 Swift 语言支持还需要 Clang 与 Swift SDK。文档给出的端到端流程Linux 示例如下# 1. 下载 Bazelisk 并赋予执行权限 curl -sL --fail https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-linux-amd64 -o bazelisk chmod x bazelisk # 2. 安装 Clang sudo apt install -y clang # 3. 下载 Swift 6.0.3 SDKDebian 12 发行版 SWIFT_VERSION6.0.3 curl -L https://download.swift.org/swift-${SWIFT_VERSION}-release/debian12/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-debian12.tar.gz | tar xz # 4. 以 clang 作为 CC将 Swift 工具链加入 PATH 后构建 CCclang PATH$PATH:$(pwd)/swift-${SWIFT_VERSION}-RELEASE-debian12/usr/bin bazel build //... # 5. 运行全部测试 CCclang PATH$PATH:$(pwd)/swift-${SWIFT_VERSION}-RELEASE-debian12/usr/bin bazel test //...若不确定应当选用哪个 Bazel / Swift 版本文档建议查看仓库 CI 配置.bazelci/presubmit.yml该文件在部分发行快照中未包含以实际拉取的仓库内容为准。从 BUILD.bazel 的源码结构看公开的 Bazel 目标包括//:flatbuffersC 运行时库cc_librarystrip_include_prefix /include即头文件以include/为根内部依赖//src:flatbuffers//:flatc编译器可执行文件cc_binary依赖//src:flatc并携带//reflection:reflection_fbs_schema数据依赖//:flatc_library供运行时解析 schema 使用的编译器库//:runtime_cc供flatbuffer_cc_library规则使用的运行时库。依赖管理方面MODULE.bazel 声明了模块版本快照中为25.12.19并引入rules_cc、rules_go、rules_swift、grpc、aspect_rules_ts等 Bazel 依赖同时通过npm扩展解析 ts/pnpm-lock.yaml 以支持 TypeScript 相关构建。四、使用 Conan 构建如果项目已采用 Conan 依赖管理可以通过 Conan Center 直接安装 FlatBuffersconan install --requiresflatbuffers/[*] --buildmissing其中[*]表示接受任意版本版本范围语法由 Conan 解析--buildmissing表示仅对缺失的包执行本地构建其余直接下载预编译产物。文档明确指出Conan Center 中的flatbuffers包由 ConanCenterIndex 社区维护若发现版本滞后或包不可用应当在 Conan Center Index 仓库提交 issue 或 PR而不是在本仓库内修复。五、使用 vcpkg 构建vcpkg 是微软维护的 C 包管理器安装步骤与常规 vcpkg 工作流完全一致git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh ./vcpkg integrate install ./vcpkg install flatbuffers./bootstrap-vcpkg.sh完成 vcpkg 自身的引导./vcpkg integrate install让 vcpkg 自动对接当前系统的构建工具MSBuild 等./vcpkg install flatbuffers安装 flatbuffers 端口及其依赖。文档同时说明vcpkg 中的 flatbuffers 端口由微软团队成员与社区贡献者共同维护若版本过期应在 vcpkg 仓库提交 issue 或 PR。六、构建 Android 测试与示例仓库根目录下的 android/ 目录包含在 Android 上构建测试可执行文件所需的全部内容。文档描述的流程为使用目录内自带的build_apk.sh脚本或按常规 Android NDK 流程使用ndk_build/adb等工具构建并部署程序运行后会在系统日志中输出测试是否通过。从源码看Android 测试主体位于 android/app/src/main/cpp/animals.cpp包含main入口与断言逻辑其构建配置由 android/app/src/main/cpp/CMakeLists.txt 提供生成的代码头文件如 android/app/src/main/cpp/generated/animal_generated.h由 schema 预先生成后随源码提交。此外文档提到可运行flatbuffers/samples下的android_sample.sh脚本或进入flatbuffers/samples/android目录用build_apk.sh构建示例这两个脚本/目录在当前仓库快照中未包含以你实际拉取的完整仓库为准。七、在自己的项目中使用 FlatBuffers7.1 C 运行时单头文件即可对 C 项目而言FlatBuffers 的运行时通常无需单独编译链接——核心代码集中在单个头文件 include/flatbuffers/flatbuffers.h 中只需把仓库的 include/ 目录加入编译器的 include 搜索路径即可。若需要在运行时动态加载 schema、把文本JSON解析为二进制 buffer则还需要include/flatbuffers下的其他头文件并额外编译链接src/idl_parser.cppschema 解析器src/idl_gen_text.cpp仅在需要把二进制转换为文本JSON 输出时才需要。这也与 CMakeLists.txt 中FlatBuffers_Library_SRCS的组成一致该列表以include/flatbuffers/*.h头文件为主仅额外收录src/idl_parser.cpp、src/idl_gen_text.cpp、src/reflection.cpp、src/util.cpp等少数实现文件。各语言Java、C#、Go、Rust、Python、TypeScript 等的接入方式请参考 官方教程按需选择对应语言的标签页查看。7.2 在 CMake 工程中集成add_subdirectory对于已经使用 CMake 的项目文档推荐一种更稳健灵活的方式把 FlatBuffers 作为主工程的一部分直接构建。做法是将 FlatBuffers 源码放到主工程可见的位置然后用add_subdirectory()挂入# 将 FlatBuffers 直接加入构建。这会定义 flatbuffers 目标。 add_subdirectory(${FLATBUFFERS_SRC_DIR} ${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-build EXCLUDE_FROM_ALL) # 然后像普通依赖一样链接。CMake 2.8.11 时该目标会自动携带头文件搜索路径。 target_link_libraries(own_project_target PRIVATE flatbuffers)这种方式的最大优势在于FlatBuffers 与主工程使用同一套编译器与链接器设置从而规避因库的 debug/release 配置不一致等导致的兼容性问题——文档特别指出这在 Windows 上尤为有用。EXCLUDE_FROM_ALL保证仅在你显式依赖flatbuffers目标时才会编译它不会把测试等无关目标带入主构建。从 CMakeLists.txt 的实现看flatbuffers静态库的 include 目录正是以$BUILD_INTERFACE:.../include形式附着因此target_link_libraries后无需手动添加 include 路径。此外仓库还提供了两套配套的 CMake 集成工具CMake/FindFlatBuffers.cmake通过find_package(FlatBuffers)查找系统已安装的flatc变量FLATBUFFERS_FLATC_EXECUTABLE与头文件FLATBUFFERS_INCLUDE_DIR并提供FLATBUFFERS_GENERATE_C_HEADERS(Name files)宏生成 C 头文件CMake/BuildFlatBuffers.cmake提供三个生成函数可在构建期自动调用flatcbuild_flatbuffers(...)经典接口支持生成头文件、二进制 schema.bfbs与文本 schema 拷贝参数包括flatbuffers_schemas、schema_include_dirs、custom_target_name、generated_includes_dir、binary_schemas_dir、copy_text_schemas_dirflatbuffers_generate_headers(...)更现代的cmake_parse_arguments风格接口支持TARGET、SCHEMAS、INCLUDE、INCLUDE_PREFIX、BINARY_SCHEMAS_DIR、FLAGS如--gen-object-api、--grpc等参数并自动处理 gRPC 代码生成与 IDE 源文件分组flatbuffers_generate_binary_files(...)根据 schema 与 JSON 文件在构建期生成.bin二进制数据文件。安装场景下find_package(flatbuffers)后可通过导出的flatbuffers::flatbuffers、flatbuffers::flatc目标使用导出配置见 CMake/flatbuffers-config.cmake 与 CMakeLists.txt 的安装规则。7.3 覆盖嵌套对象默认解析深度FlatBuffers 解析器对嵌套对象table 递归有默认深度上限防止畸形数据导致栈溢出。若需调整在调用add_subdirectory(${FLATBUFFERS_SRC_DIR})之前加入set(FLATBUFFERS_MAX_PARSING_DEPTH 16)从源码看CMakeLists.txt 在检测到该变量已定义时会执行add_definitions(-DFLATBUFFERS_MAX_PARSING_DEPTH...)并把值打印到配置日志从而把宏注入整个编译单元。该宏的默认行为及解析深度语义详见 C 语言指南。八、下载官方二进制与 SLSA3 签名校验如果不想从源码构建可以直接从 FlatBuffers 的 GitHub Release 页面下载预编译二进制。自某版本起官方使用 OpenSSF 的 slsa-framework/slsa-github-generator 为每个发布产物生成 SLSA3 签名provenance可按以下步骤验证下载文件的完整性按 slsa-framework/slsa-verifier 的安装说明安装验证工具slsa-verifier从对应 GitHub Release 下载名为attestation.intoto.jsonl的证明文件执行验证$ slsa-verifier -artifact-path downloaded.zip -provenance attestation.intoto.jsonl -source github.com/google/flatbuffers -tag version PASSED: Verified SLSA provenance当输出PASSED: Verified SLSA provenance时即证明该二进制确实由github.com/google/flatbuffers在指定版本标签下构建未被篡改。SLSA 供应链安全等级对发布流程提出了严格的可复现构建要求这也能解释为何本仓库对编译器、严格模式与各平台工具链的一致性如此重视。九、构建实战小结与注意事项场景推荐路径关键命令/要点快速本地构建CMakecmake -G Unix Makefiles -DCMAKE_BUILD_TYPERelease make -j提交代码前自检CMake Strict追加-DFLATBUFFERS_STRICT_MODEON模拟 CI 的-WerrorBazel 工程使用Bazelbazel build //...Swift 支持需 Clang Swift SDKConan 用户Conanconan install --requiresflatbuffers/[*] --buildmissingvcpkg 用户vcpkg./vcpkg install flatbuffers自有 CMake 工程add_subdirectory链接flatbuffers目标自动携带头文件路径只读使用运行时单头文件include include/flatbuffers/flatbuffers.h动态解析再加 src/idl_parser.cpp 与 src/idl_gen_text.cpp验证下载产物SLSA3slsa-verifierattestation.intoto.jsonl最后几点基于源码的实践提示测试入口配置构建时保留默认的FLATBUFFERS_BUILD_TESTSON构建后用ctest运行flattests可一次性覆盖解析、序列化、JSON、FlexBuffers、进化兼容等测试测试源见 tests/test.cpp 与 tests/monster_test.cpp。版本与 ABI共享库的 SONAME 使用完整版本号因为项目采用日历版本且不承诺 ABI 稳定CMakeLists.txt 源码注释升级依赖时应关注版本差异。严格模式是 CI 底线文档明确要求提交代码前以FLATBUFFERS_STRICT_MODEON验证编译这既是本仓库的代码规范也建议作为二次开发者的本地检查步骤。平台差异FLATBUFFERS_CODE_COVERAGE与FLATBUFFERS_CODE_SANITIZE仅支持 Linux/macOSWindows 上 sanitize 退化为 MSVC 内存泄漏检测FLATBUFFERS_MEMORY_LEAK_TRACKING见 CMakeLists.txt跨平台移植时需注意开关的适用前提。【免费下载链接】flatbuffersFlatBuffers: Memory Efficient Serialization Library项目地址: https://gitcode.com/GitHub_Trending/fl/flatbuffers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。