)
Protocol Buffers C 从源码构建安装指南Bazel 与 CMake 双路径实战MongoDB 仓库内嵌源码版【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo本文基于 MongoDB 仓库内嵌的 Protocol Buffersprotobuf源码 src/third_party/protobuf/dist/src/README.md 展开系统讲解如何用 Bazel 或 CMake 从源码编译 C 版的 protobuf 运行时与protoc编译器覆盖 Linux/macOS/Windows 三平台的环境准备、源码获取、构建、安装以及依赖包接入方式并补充二进制兼容性ABI注意事项。读完本文你将掌握在当前仓库的 protobuf 内嵌副本上完成编译安装的完整流程也能理解protoc、protobuf、protobuf_lite等 Bazel 目标在仓库中的真实定义与用途。一、文档背景这份 README 讲什么src/third_party/protobuf/dist/src/README.md是 protobuf 官方发布包中位于src/目录下的构建说明聚焦于C 运行时与 protoc 编译器的源码级构建与安装。它本身不重复 protobuf 的语法教程那部分在 protobuf.dev 的完整文档中而是解决三个实操问题在 Linux/macOS 上用 Bazel 从源码构建并安装protoc与 libprotobuf在 Windows 上通过官方发布包zip 二进制或vcpkg快速获得可用的 protoc 与依赖编译依赖 protobuf 的第三方包时如何在 Bazel WORKSPACE 中接入本仓库并加载依赖。该文档落位于 MongoDB 仓库的 src/third_party/protobuf/dist/src 目录与同目录下的 BUILD.bazel、file_lists.cmake 等文件共同构成完整的内嵌 protobuf 源码树。二、环境准备与工具链Unix 平台要在 Linux/macOS 上从源码构建 protobuf文档明确列出了 4 项必备工具工具用途Bazel构建系统负责解析 BUILD 规则并产出protoc与 libprotobufgit拉取源码仓库及子模块gC 编译器GCC 工具链Abseilprotobuf 的 C 依赖库需单独安装在 Ubuntu/Debian 系发行版上一条命令即可安装大部分依赖sudo apt-get install g git bazel其他平台请使用对应的包管理器安装相同工具Bazel 的安装细节以 Bazel 官方安装文档为准。若不想用 Bazel也可以改用 CMake 路径构建见下文第四节。Abseilabseil-cpp需要单独获取与安装它是 protobuf C 运行时在较新版本中的基础依赖。三、获取源码发行包与 git clone 两种方式文档给出两种源码获取方式方式一下载发行包。在 protobuf 的 releases 页面下载.tar.gz或.zip源码包。这种方式的优势是已经包含子模块内容、无需再生成 configure 脚本开箱即用。方式二git clone 源码仓库。克隆仓库后必须额外完成两步发行包可跳过git clone protobuf 仓库地址 cd protobuf git submodule update --init --recursivegit submodule update --init --recursive的作用是递归拉取所有子模块——protobuf 源码树依赖 upb、Abseil 等多个子仓库漏掉这一步会导致构建时找不到依赖目标。提示在 MongoDB 仓库中这份源码已经以内嵌副本形式存在于src/third_party/protobuf/dist/无需自行 clone。仓库根目录的 MODULE.bazel 与dist/下的 MODULE.bazel、WORKSPACE 共同管理着 protobuf 及其依赖的解析。四、用 Bazel 构建 C 运行时与 protoc在源码根目录执行bazel build :protoc :protobuf该命令会同时产出两个核心目标:protoc—— Protocol Buffer 编译器二进制负责把.proto文件翻译成目标语言代码:protobuf—— C 运行时库libprotobuf。构建完成后即可安装编译器例如在 Linux 上cp bazel-bin/protoc /usr/local/bin4.1 仓库中的目标定义印证在当前仓库的 dist/BUILD.bazel 中可以看到这些目标的真实定义protoc_lib别名目标指向//src/google/protobuf/compiler:protoc_lib供其他规则引用编译器核心库protoccc_binary可执行文件链接protoc_lib_stage1使用仓库统一编译选项COPTS与链接选项LINK_OPTSprotoc_stage0阶段 0 编译器仅对包内可见用于引导生成 descriptor 等代码protoc_static静态链接变体在 macOS 上因缺少lcrt0.o静态库而使用动态链接交叉编译时通过fully_static_linkfeature 全静态链接——这正呼应了原 README 中建议考虑静态链接的提示protobuf运行时别名指向//src/google/protobuf:protobuf_layering_check_legacy同时被proto_lang_toolchain使用供用户自定义语言 toolchain 复用。4.2 编译依赖 protobuf 的第三方包如果只是使用protobuf而非开发 protobuf 本身需要在自己的 Bazel WORKSPACE 中把 protobuf 仓库挂接进来并加载其依赖。原文档给出了位于examples/目录下的 WORKSPACE 示例作参考核心思路是通过local_repository/git_repository引入 protobuf 仓库再依次加载其暴露的依赖管理规则如protobuf_deps()定义于 dist/protobuf_deps.bzl确保 Abseil、upb 等间接依赖被正确解析。之后便可在自己的 BUILD 文件中通过protobuf//:protobuf、protobuf//:protoc或 well-known types 目标如protobuf//:any_proto、protobuf//:timestamp_proto见 dist/BUILD.bazel进行引用。4.3 macOS 用户的特殊准备Unix 工具链在 macOS 上默认不可用需要两步准备先从 Mac AppStore 安装 Xcode再在终端执行sudo xcode-select --install安装 Unix 工具。两种常见途径任选其一MacPorts默认安装位置/opt/local/bin/portsudo /opt/local/bin/port install bazelHomebrewbrew install bazel安装完成后其余步骤与前面 Unix 章节完全一致。五、Windows 平台构建与安装Windows 上有三条路线按使用场景选择5.1 只使用 protoc 二进制若只需要编译器而不需要从源码构建直接从 protobuf 官方 releases 页面的下载区获取protoc-$VERSION-win32.zip。该压缩包内含protoc可执行文件以及 protobuf 库的公共 proto 文件well-known types。关键约束protoc 二进制与生成的代码gencode版本必须匹配。这对应 protobuf 官方文档中跨版本运行时保证cross-version runtime guarantee一节对 C 的说明——混用不同版本的 protoc 与运行时可能导致生成代码无法链接或行为异常。5.2 使用 vcpkg 安装vcpkg可一站式安装 protobuf 及其依赖vcpkg install protobuf protobuf:x64-windows需要 zlib 支持时追加 zlib feature注意同时指定平台三元组vcpkg install protobuf[zlib] protobuf[zlib]:x64-windows5.3 从源码构建Microsoft Visual CMSVC使用 CMake 路径构建具体步骤见文档中指向的cmake/README.mdCygwin / MinGW工具链本质是类 Unix 环境直接沿用前面Unix 安装说明即可。六、二进制兼容性警告为什么建议静态链接原 README 用一个专门章节强调了一个 C 世界的老问题——ABI 兼容性由于 C 语言的特性任意两个不同版本的 Protocol Buffers C 运行时库几乎不可能具有兼容的 ABIApplication Binary Interface。换言之如果一个可执行文件链接了旧版本的 libprotobuf那么在不重新编译的情况下指望它直接换用新版本运行时是不现实的。这种不兼容通常在应用启动时立即暴露例如符号缺失、初始化失败但一旦发生往往难以排查。对此官方建议优先考虑静态链接。在 Bazel 的cc_binary规则中通过linkstatic True启用cc_binary( name my_app, srcs [main.cc], deps [protobuf//:protobuf], linkstatic True, )静态链接把 libprotobuf 直接并入产物从根源上规避了运行库版本漂移导致的 ABI 风险。仓库侧的佐证同样存在如 protoc_static 目标即为静态链接变体其注释明确指出 macOS 因缺少lcrt0.o静态库而无法完全静态化其余平台通过fully_static_link特性实现全静态链接——这说明 protobuf 官方自身的发布物也在实践这一建议。七、Lite 运行时另一条 ABI 之外的取舍线除了protobuf完整运行时仓库还提供了protobuf_lite。在 dist/BUILD.bazel 中可以看到其设计意图对于在.proto文件中指定了optimize_for LITE_RUNTIME;选项的 proto 文件可以使用lite运行时。protobuf_lite移除了反射reflection与 descriptor 全量支持等重型特性换来更小的二进制体积适合嵌入式、移动端等对包体敏感的场景。这一目标与protoc的--cpp_out生成逻辑配合使用是理解 protobuf 在 C 侧完整版 vs 精简版两条技术路线时的关键参照。八、进一步学习与使用完整文档protobuf 的完整语法、各语言 API 与 best practice 收录于官方文档站 protobuf.dev包括本文涉及的跨版本运行时保证cross-version runtime guarantee等专题版本信息当前仓库内嵌副本的版本号可查看 dist/protobuf_version.bzl 与 dist/version.json源码入口C 实现主体位于 src/third_party/protobuf/dist/src/google/protobuf编译器实现位于其中的compiler/子目录upbC 语言实现位于 dist/upb在 MongoDB 中的角色这份内嵌源码被 MongoDB 的构建系统见仓库根目录 MODULE.bazel 及src/third_party/下的依赖管理作为第三方依赖引入是理解 MongoDB 消息序列化基础设施的入口之一。结语围绕src/third_party/protobuf/dist/src/README.md的内容本文完整覆盖了 Linux/macOS 的 Bazel 构建、Windows 的 zip/vcpkg/源码三条路线、ABI 兼容性警告与静态链接建议并结合仓库内 dist/BUILD.bazel 中的protoc、protobuf、protobuf_lite等目标定义做了源码级印证。无论你是在自己的 Bazel 工程中接入 protobuf还是准备从这份内嵌源码重新编译一套工具链本文给出的命令与注意事项都具备直接可操作性。【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考