MNN 仓库内 FlatBuffers 构建指南:从 flatc 编译器到 CMake 集成实战

发布时间:2026/9/15 1:54:35
MNN 仓库内 FlatBuffers 构建指南:从 flatc 编译器到 CMake 集成实战 MNN 仓库内 FlatBuffers 构建指南从 flatc 编译器到 CMake 集成实战【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNNFlatBuffers 是 MNN 模型文件.mnn的底层序列化格式MNN 将其以第三方依赖形式随仓库分发见 3rd_party/flatbuffers并通过flatc编译器将.fbs模式定义生成各语言代码。本篇以官方文档 3rd_party/flatbuffers/docs/source/Building.md 为主线结合仓库内的 CMakeLists.txt、schema/generate.sh 与 CMake/BuildFlatBuffers.cmake 等源码完整覆盖 CMake 构建、Android 构建、集成进自有工程三个场景读者可据此在任意平台产出flatc可执行文件并正确使用 FlatBuffers 运行时。一、用 CMake 构建 FlatBuffers产出 flatc 编译器FlatBuffers 发行版自带一份CMakeLists.txt可据此为任何平台生成工程/构建文件。构建的第一步是生成flatc编译器可执行文件它是后续所有步骤生成头文件、校验 schema、序列化数据的基础。其目标构成见 3rd_party/flatbuffers/CMakeLists.txt#L69-L93flatc由通用运行时源码src/idl_parser.cpp、src/util.cpp等加上各语言的代码生成器idl_gen_cpp.cpp、idl_gen_go.cpp、idl_gen_python.cpp、idl_gen_rust.cpp、idl_gen_grpc.cpp等共同编译而成因此一个flatc二进制即可同时输出 C/Go/Python/Rust/Java/C# 等多语言绑定。1.1 平台通用构建命令在仓库根目录下按平台选择生成器cmake -G Unix Makefiles -DCMAKE_BUILD_TYPERelease cmake -G Visual Studio 10 -DCMAKE_BUILD_TYPERelease cmake -G Xcode -DCMAKE_BUILD_TYPERelease随后按平台常规方式执行构建如make或打开生成的工程即可得到flatc可执行文件。注意以下要点CMake 版本要求仓库中的 3rd_party/flatbuffers/CMakeLists.txt#L1 声明cmake_minimum_required(VERSION 3.6)请确保本机 CMake ≥ 3.6。切换编译器若想用 clang 替代 gcc需要先设置环境变量再执行 cmake例如CC/usr/bin/clang CXX/usr/bin/clang cmake -G Unix Makefiles验证构建结果从3rd_party/flatbuffers根目录运行flattests可执行文件确认当前平台一切正常。注意必须在 FlatBuffers 发行版的根目录运行flattests或flatsampletext否则程序会因找不到数据文件而失败测试运行器会把 3rd_party/flatbuffers/tests 目录整体拷贝到构建输出目录见 CMakeLists.txt#L429-L431。1.2 构建产物两个示例程序除flatc外构建还会产出两个示例可执行文件flatsamplebinary对应 3rd_party/flatbuffers/samples/sample_binary.cpp演示将monster.fbs定义的怪物数据序列化为二进制缓冲flatsampletext对应 3rd_party/flatbuffers/samples/sample_text.cpp演示在二进制缓冲与文本JSON之间转换。两者依赖的monster_generated.h由构建期自定义命令在编译flatc之后自动生成见 CMakeLists.txt#L323-L327可作参考实现直接对照学习。1.3 关键 CMake 选项速查仓库的 3rd_party/flatbuffers/CMakeLists.txt#L8-L25 提供了一批构建开关按需裁剪产物大小或开启调试能力CMake 选项默认值作用FLATBUFFERS_BUILD_TESTSON构建测试与示例flattests、flatsamplebinary等FLATBUFFERS_BUILD_FLATLIBON构建静态库flatbuffersFLATBUFFERS_BUILD_FLATCON构建flatc编译器FLATBUFFERS_BUILD_FLATHASHON构建flathash哈希工具FLATBUFFERS_BUILD_SHAREDLIBOFF构建共享库flatbuffers_shared含 SOVERSION 管理FLATBUFFERS_BUILD_GRPCTESTOFF构建 gRPC 测试需额外指定GRPC_INSTALL_PATH与PROTOBUF_DOWNLOAD_PATHFLATBUFFERS_INSTALLON安装头文件、库与 CMake 包FlatbuffersConfig.cmakeFLATBUFFERS_CODE_COVERAGEOFF开启代码覆盖率仅 Linux/macOSFLATBUFFERS_CODE_SANITIZEOFF为flattests和flatc追加-fsanitize标志FLATBUFFERS_LIBCXX_WITH_CLANGON使用 clang 时强制链接 libc一个值得注意的联动FLATBUFFERS_BUILD_TESTS依赖FLATBUFFERS_BUILD_FLATC——若关闭编译器却保留测试构建会在第 27-31 行给出警告并自动禁用测试。二、在 MNN 中实际构建 flatcschema 生成链路MNN 的 schema 目录schema/default 下的MNN.fbs、Tensor.fbs、CaffeOp.fbs等必须经flatc编译后才能得到运行时使用的头文件schema/current 下的*_generated.h。整个流程由 schema/generate.sh 驱动是官方构建指南在 MNN 中的直接落地# 若 3rd_party/flatbuffers/tmp/flatc 不存在则自动构建 FLATC../3rd_party/flatbuffers/tmp/flatc if [ ! -e $FLATC ]; then pushd ../3rd_party/flatbuffers mkdir -p tmp cd tmp cmake .. cmake --build . --target flatc -- -j4 popd fi关键步骤拆解按需编译脚本先检查3rd_party/flatbuffers/tmp/flatc是否存在不存在才执行cmake .. cmake --build . --target flatc——只构建flatc单一目标避免编译整个测试集显著缩短首次构建时间批量生成随后进入schema/current目录将 schema/default 下所有.fbs一次性交给flatcfind ../$DIR/*.fbs | xargs ../$FLATC -c -b --gen-object-api --reflect-names其中-c生成 C 头文件-b同时生成二进制 schema.bfbs--gen-object-api产出易用的对象式 API--reflect-names保留字段名以支持反射结果落盘生成的*_generated.h写入 schema/current随后被 MNN 主工程通过 include 路径引用——见 CMakeLists.txt#L460-L484 中include_directories(... 3rd_party/flatbuffers/include ...)与schema/current/的配置。MNN 直接以源码依赖方式使用 FlatBuffers 头文件3rd_party/flatbuffers/include/flatbuffers/flatbuffers.h这与官方构建指南头文件即运行时的定位完全一致运行时无需单独编译链接仅编译期依赖即可。三、构建 Android 版本官方构建指南说明 FlatBuffers 可直接为 Android 构建测试程序。在 MNN 仓库的 vendored 副本中对应资源位于 3rd_party/flatbuffers/samples/android含AndroidManifest.xml、gradlew、jni/等入口脚本为 3rd_party/flatbuffers/samples/android_sample.sh。运行 Android 示例有两种方式执行android_sample.sh从3rd_party/flatbuffers/samples目录运行该脚本自动完成构建、打包与部署进入samples/android目录手动构建使用其中gradlew封装或直接调用ndk_build/adb等常规 Android 工具链。程序运行后会把测试结果输出到日志中据此判断测试是否通过。四、在自有项目中集成 FlatBuffers4.1 C 运行时单头文件引入对 C 项目通常无需编译任何运行时——全部实现都在单个头文件 3rd_party/flatbuffers/include/flatbuffers/flatbuffers.h 中该头文件约 2585 行内置了Offset、Vector、EndianScalar、IndirectHelper等核心模板。集成步骤把include目录加入编译器的 include 搜索路径若需要在运行时加载 schema 或把文本解析为二进制缓冲还需链接src/idl_parser.cppschema 解析器若还希望将二进制缓冲转换回文本需额外链接src/idl_gen_text.cpp。对应地3rd_party/flatbuffers/CMakeLists.txt#L49-L67 中的FlatBuffers_Library_SRCS正是由idl_parser.cpp、idl_gen_text.cpp、util.cpp、reflection.cpp等组成——静态库flatbuffers编译的就是这套运行时源码。4.2 在 CMake 工程中直接内嵌add_subdirectory如果自有项目已经使用 CMake官方推荐把 FlatBuffers 作为子工程直接构建而不是预编译库。这样 FlatBuffers 与主工程共享同一套编译器与链接器设置可避免 debug/release 库混用等二进制兼容问题Windows 上尤为关键。假设 FlatBuffers 源码位于${FLATBUFFERS_SRC_DIR}在自有CMakeLists.txt中加入# Add FlatBuffers directly to our build. This defines the flatbuffers target. add_subdirectory(${FLATBUFFERS_SRC_DIR} ${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-build EXCLUDE_FROM_ALL) # Now simply link against flatbuffers as needed to your already declared target. # The flatbuffers target carry header search path automatically if CMake 2.8.11. target_link_libraries(own_project_target PRIVATE flatbuffers)要点说明EXCLUDE_FROM_ALL使flatbuffers库不会在全局构建时被默认编译只在被链接的目标需要时才触发CMake 版本 2.8.11 时flatbuffers目标会自动携带头文件搜索路径仓库的 CMakeLists.txt#L249-L251 通过target_include_directories(... INTERFACE ...)实现无需手动再添加 include 目录若用外部安装的flatc而非内嵌构建可在调用build_flatbuffers()前设置FLATBUFFERS_FLATC_EXECUTABLE变量——3rd_party/flatbuffers/CMake/BuildFlatBuffers.cmake#L58-L65 会根据该变量决定生成规则依赖内嵌的flatc目标还是直接用外部可执行文件。4.3 使用 build_flatbuffers() 自动生成代码对多 schema 工程仓库提供了更高级的辅助函数build_flatbuffers()定义于 3rd_party/flatbuffers/CMake/BuildFlatBuffers.cmake#L50-L56它封装了 C 头文件生成-c默认附带--gen-mutable、二进制 schema 生成-b --schema与文本 schema 拷贝三类规则并自动注册 include 目录。函数签名为build_flatbuffers(flatbuffers_schemas schema_include_dirs custom_target_name additional_dependencies generated_includes_dir binary_schemas_dir copy_text_schemas_dir)调用时务必用引号包裹列表参数否则 CMake 只会传入第一个元素如build_flatbuffers(${fb_files} ${include_dirs} target_name ...)。4.4 覆盖嵌套对象递归深度上限解析 schema 时 FlatBuffers 对嵌套对象深度设有限制默认值为 64定义于 3rd_party/flatbuffers/include/flatbuffers/idl.h#L39-L40。若自有 schema 嵌套层级超过该值需要在add_subdirectory(${FLATBUFFERS_SRC_DIR})之前加入set(FLATBUFFERS_MAX_PARSING_DEPTH 16)仓库的 3rd_party/flatbuffers/CMakeLists.txt#L33-L37 会将该变量转换为编译宏-DFLATBUFFERS_MAX_PARSING_DEPTH...并打印状态信息同时该宏也作为运行时解析深度校验的基准值越大允许解析的 schema 嵌套越深但递归栈开销也相应增加。4.5 关于 Google Play 应用中的版本字符串官方构建指南还提到集成 FlatBuffers 的应用在 Google Play 分发时库中会嵌入版本字符串flatbuffer_version_string用于使用情况统计。该字符串仅占用应用二进制中极少字节不影响运行行为由于项目为开源Apache License 2.0开发者可以移除它但官方希望尽量保留以支持项目的持续投入。五、从源码结构看支持范围结合 3rd_party/flatbuffers/readme.md 与编译器源码构成CMakeLists.txt#L69-L93可以确认操作系统Windows、macOS、Linux、Android以及任何具备现代 C 编译器的平台语言flatc内置 C、C、C#、Dart、Go、Java、JavaScript、TypeScript、PHP、Python、Rust、Lua、Lobster 等语言的代码生成器一次编译即可服务多语言工程构建系统除 CMake 外仓库还随附WORKSPACEBazel、pom.xmlMaven、conanfile.pyConan等第三方集成文件说明其可融入多种主流构建体系。对 MNN 而言FlatBuffers 的价值在于schema 定义经flatc编译成零拷贝可访问的序列化结构配合 MNN 的推理运行时在移动端保持极低的内存占用与解析开销——这正是 FlatBuffers 直接访问序列化数据、无需反序列化 设计目标在端侧 AI 引擎中的典型应用场景。六、常见问题排查要点flattests加载文件失败必须从 FlatBuffers 发行版根目录运行而不是构建输出目录或任意目录构建无产出检查是否误关FLATBUFFERS_BUILD_FLATC——关闭后测试与示例会被一并禁用见 CMakeLists.txt#L27-L31schema 生成命令不识别确保使用仓库内tmp/flatc由 schema/generate.sh 自动构建或版本匹配的flatc新旧版本间--gen-object-api、--reflect-names等参数行为可能存在差异解析深层嵌套 schema 报错在add_subdirectory前按 4.4 节调大FLATBUFFERS_MAX_PARSING_DEPTH。以上所有构建与集成命令均基于当前仓库的 vendored 副本3rd_party/flatbuffers验证路径编写可直接在 MNN 工程内复现无需额外下载外部依赖。【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询