基于 MSYS2/MinGW64 构建 Apache Thrift 的完整实战指南 📅 发布时间:2026/9/15 17:43:18 👁 浏览次数: 基于 MSYS2/MinGW64 构建 Apache Thrift 的完整实战指南【免费下载链接】thriftApache Thrift项目地址: https://gitcode.com/GitHub_Trending/thr/thrift导读本文聚焦 Apache Thrift 在 Windows 平台上的一个经典构建路径使用 MSYS2 发行版搭配 MinGW-w64 工具链通过 CMake 从源码编译出可用的 Thrift 编译器与 C 运行库。文章将完整还原官方构建文档 build/cmake/README-MSYS2.md 中的环境准备、依赖安装、CMake 配置参数与编译测试全流程并结合仓库内的 DefineOptions.cmake、mingw32-toolchain.cmake 等源码级证据逐一解释每个关键选项的作用、默认值与注意事项。读完本文你将能够独立在 Windows MSYS2 环境下完成 Thrift 的静态库构建、运行测试并理解构建过程中为何要关闭某些组件背后的技术原因。一、为什么选择 CMake MSYS2 构建 ThriftApache Thrift 采用 CMake 作为跨平台构建系统其目的见 build/cmake/README.md是扩展传统 autotools 的构建方式实现尽可能多的平台上的可执行文件与库的自动检测机制同时简化发布与打包流程。CMake 的一个额外好处是构建框架由 CMake 现场生成源码树中不再内置任何 IDE 解决方案文件。但要在 Windows 上构建出功能完整、可用于生产的 Thrift光有 CMake 还不够还需要预先准备一批第三方库Boost、OpenSSL、zlib 等。当第三方库就绪后还必须向 CMake 传递正确的选项组合才能生成正确的构建环境。这正是 build/cmake/README-MSYS2.md 要解决的核心问题在 MSYS2/MinGW64 环境下如何拿到依赖、如何配置选项、如何完成构建与测试。关于工具链的选型MSYS2 提供的 MinGW-w64 工具链直接面向 Windows 目标生成原生可执行文件与 Visual Studio (MSVC) 方案、Cygwin 方案、以及仓库中的 mingw32-toolchain.cmake 交叉编译方案形成互补。仓库的持续集成脚本 build/appveyor/MINGW-appveyor-full.bat 即为 MSYS2 MinGW 方案在 AppVeyor 上的自动化落地可作为本地构建的参照。二、MSYS2 环境准备与工具链安装2.1 安装与升级 MSYS2首先从 MSYS2 官方网站下载并安装 MSYS2安装完成后务必执行完整升级pacman -Syu必要时重复执行确保基础系统与软件源处于最新状态。本文档对应的官方验证环境为msys2 64-bit 2016-10-26 发行版见原文 Tested With 一节由于 MSYS2 滚动更新的特性新版本一般仍然适用但遇到异常时建议参考对应时期的软件源快照。2.2 安装 C 构建所需软件包打开 MSYS2 终端使用 pacman 一次性安装以下软件包$ pacman --needed -S bison flex make mingw-w64-x86_64-openssl \ mingw-w64-x86_64-boost mingw-w64-x86_64-cmake \ mingw-w64-x86_64-toolchain mingw-w64-x86_64-zlib各软件包的作用如下软件包作用bison、flexThrift IDL 编译器thrift-compiler的词法/语法分析器生成工具编译器源码中对应compiler/cpp/src/thriftl.llflex 词法与thrifty.yybison 语法make构建驱动工具mingw-w64-x86_64-toolchainMinGW-w64 的 gcc/g 完整工具链含链接器、头文件与标准库mingw-w64-x86_64-cmakeCMake 的 MinGW 版本配合-GMinGW Makefiles生成器mingw-w64-x86_64-boostC 库的必需依赖Boostfind_package时被 DefineOptions.cmake 隐式检测mingw-w64-x86_64-opensslOpenSSL用于WITH_OPENSSL特性TLS 支持mingw-w64-x86_64-zlibzlib 压缩库用于WITH_ZLIB特性注意当前仓库版本为 0.25.0见 CMakeLists.txt其 CMake 最低版本要求为 3.16见 CMakeLists.txt因此请确保安装的mingw-w64-x86_64-cmake满足此要求。2.3 配置 PATH 环境变量MSYS2 的默认 shellbash并不会自动把/mingw64/bin加入 PATH。必须手动将其追加到~/.bash_profileecho export PATH/mingw64/bin:\$PATH ~/.bash_profile然后关闭当前 shell重新打开一个新 shell使 PATH 生效。这一步至关重要——只有/mingw64/bin位于 PATH 前端cmake、mingw32-make、gcc/g等 MinGW 工具才能被正确找到而不是误用 MSYS 自身的同名工具。仓库的 CI 脚本 build/appveyor/MINGW-appveyor-full.bat 也做了同样的事情通过sed -i清理旧的 PATH 行再写入export PATH/mingw%NORM_PLATFORM%/bin:$PATH其中NORM_PLATFORM为 32 或 64并支持 x86/x64 双架构矩阵i686/x86_64。三、CMake 配置选项逐一拆解3.1 创建独立的构建目录out-of-treeThrift 明确要求采用out-of-tree树外构建即在源码目录之外单独建一个构建目录避免污染源码树。假设你当前位于 thrift 源码树的顶层目录mkdir ../thrift-build cd ../thrift-build然后在构建目录内执行 cmake 配置命令cmake -GMinGW Makefiles -DCMAKE_MAKE_PROGRAM/mingw64/bin/mingw32-make \ -DCMAKE_C_COMPILERx86_64-w64-mingw32-gcc.exe \ -DCMAKE_CXX_COMPILERx86_64-w64-mingw32-g.exe \ -DWITH_LIBEVENTOFF \ -DWITH_SHARED_LIBOFF -DWITH_STATIC_LIBON \ -DWITH_JAVAOFF -DWITH_PYTHONOFF -DWITH_PERLOFF \ ../thrift下面逐项解释每个参数的含义与理由。3.2 生成器与编译器参数-GMinGW Makefiles指定 CMake 生成器为 MinGW 专用的 Makefile 生成器。它与CMAKE_MAKE_PROGRAM/mingw64/bin/mingw32-make配合指明实际调用/mingw64/bin/mingw32-make来驱动编译链接。-DCMAKE_C_COMPILERx86_64-w64-mingw32-gcc.exe与-DCMAKE_CXX_COMPILERx86_64-w64-mingw32-g.exe显式指定 C 与 C 编译器。MSYS2 的 MinGW-w64 工具链提供了x86_64-w64-mingw32-前缀的 GCC 编译器显式指定可避免 CMake 在检测编译器时产生歧义。从仓库的交叉编译工具链文件 mingw32-toolchain.cmake 可以看到同样的思路它设置CMAKE_SYSTEM_NAME Windows、指定i586-mingw32msvc-gcc/g与 windres 资源编译器并配置CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER程序在宿主环境查找、LIBRARY/INCLUDE ONLY头文件与库只在目标环境查找。如果你采用 MinGW 交叉编译而非 MSYS2 原生环境可通过-DCMAKE_TOOLCHAIN_FILEbuild/cmake/mingw32-toolchain.cmake传入该文件见 build/cmake/README.md。3.3 特性开关为什么必须关闭 libevent-DWITH_LIBEVENTOFF这是本文档中最重要的一个开关。Thrift 的非阻塞服务器thriftnb即libthriftnb库依赖 libevent从 lib/cpp/CMakeLists.txt 可以看到当WITH_LIBEVENT为 ON 时thriftnb会链接libevent::core与libevent::extra。但官方明确警告libevent 与 libevent-devel不适用于本工具链——它们无法正确识别 mingw64并且会期望一些不存在的头文件因此非阻塞服务器目前不会构建进本方案。也就是说在 MSYS2/MinGW64 环境下libevent 的 MinGW 移植存在问题强行开启WITH_LIBEVENT会导致配置或编译失败所以必须显式置为 OFF。-DWITH_SHARED_LIBOFF -DWITH_STATIC_LIBON产物形态控制——只构建静态库不构建共享库DLL。从 DefineOptions.cmake 的源码可以看到WITH_SHARED_LIB与WITH_STATIC_LIB属于已弃用选项其作用是间接设置新选项BUILD_SHARED_LIBSWITH_SHARED_LIBON→BUILD_SHARED_LIBSONWITH_STATIC_LIBON→BUILD_SHARED_LIBSOFF两者同时开启会触发FATAL_ERROR。因此使用新写法-DBUILD_SHARED_LIBSOFF是等价的且能避免弃用警告。原文采用旧写法以保证与当时文档的一致性实际构建时二者皆可。-DWITH_JAVAOFF -DWITH_PYTHONOFF -DWITH_PERLOFF关闭不需要的语言运行库。CMake 默认会尽可能多地构建语言库——只要检测到对应依赖如 Java/Gradle、Python3 解释器与头文件、Perl就启用。在 MSYS2 环境下这些依赖往往不全或无需构建因此显式关闭可避免配置阶段因缺依赖而失败也显著缩短构建时间。相关开关的依赖检测逻辑见 DefineOptions.cmake例如 Python 库只有在Python3_Interpreter_FOUND与Python3_Development_FOUND同时成立时才构建。3.4 其余常用选项参考虽然 MSYS2 场景未使用但理解以下选项有助于按需调整均定义于 DefineOptions.cmake选项默认值说明BUILD_COMPILERON是否构建 Thrift 编译器thrift-compiler测试与教程默认依赖它BUILD_TESTINGON依赖编译器存在是否构建单元测试并启用ctest对应make check别名BUILD_TUTORIALSON依赖编译器存在是否构建官方教程示例BUILD_CPP/WITH_CPPON是否构建 C 运行库libthriftWITH_OPENSSLON依赖找到 OpenSSLOpenSSL 支持MSYS2 下由mingw-w64-x86_64-openssl提供WITH_ZLIBON依赖找到 zlibzlib 压缩支持WITH_QT5ON依赖找到 Qt5Qt5 支持非阻塞库的 Qt 版本MinGW 下 Qt 包过大CI 中明确不装从 CMakeLists.txt 还可看到C 测试目录test/cpp只有在WITH_LIBEVENT AND WITH_ZLIB AND WITH_OPENSSL三者同时满足时才会加入构建否则会输出警告 libevent and/or ZLIB and/or OpenSSL not found or disabled; will not build some tests。这解释了 MSYS2 场景下关闭 libevent 的连锁影响——部分依赖 libevent 的测试会被跳过但核心构建不受影响。四、构建与测试4.1 编译在构建目录thrift-build内执行cmake --build .cmake --build .会自动调用之前指定的mingw32-make完成整个项目的编译与链接。产物包括compiler/cpp/thrift-compilerThrift IDL 编译器由 CMakeLists.txt 中的add_subdirectory(compiler/cpp)引入lib/cpp/libthrift.aC 静态运行库因为关闭了共享库各启用语言库的对应产物。4.2 运行测试继续在构建目录内执行ctestctest会运行 CMake 注册的全部测试用例仅限因关闭 libevent 而仍被启用的那部分。仓库根 CMakeLists.txt 在开启BUILD_TESTING时调用enable_testing()并定义了make check作为ctest的别名因此也可以使用make check达到同样效果。4.3 参考 CI 脚本中的构建流程仓库的 AppVeyor 持续集成脚本 build/appveyor/MINGW-appveyor-full.bat 完整复现了上述流程可作为端到端参照安装包列表在文档基础上增加了mingw-w64-x86_64-libevent与base-devel并支持i686/x86_64双平台配置命令使用cmake.exe配合-GMinGW Makefiles、-DCMAKE_MAKE_PROGRAM/mingw64/bin/mingw32-make、-DCMAKE_C_COMPILER/mingw64/bin/gcc.exe、-DCMAKE_CXX_COMPILER/mingw64/bin/g.exe以及-DOPENSSL_ROOT_DIR/mingw64、-DWITH_PYTHONOFF随后依次执行cmake --build .与cmake --install .测试阶段使用ctest.exe --timeout 300 --extra-verbose并支持通过--exclude-regex排除已知失败用例。另外仓库中的 build/appveyor/MSYS-appveyor-full.bat 展示了 MSYS非 MinGW64环境的另一种配置思路使用gcc.exe/g.exe、make.exe与 Boost 相关选项目前该脚本默认标记为不支持EXIT /B 1但其中-DWITH_SHARED_LIBOFF -DWITH_STATIC_LIBON的用法与本文档一致并提供了 THRIFT-4106 的参考concurrency_test在 MinGW 下可能随机失败需要从测试中排除。五、常见问题与排障建议libevent 相关报错请确认-DWITH_LIBEVENTOFF已显式传入。若未关闭MSYS2/MinGW64 下 libevent 会因无法正确识别 mingw64 而失败见 build/cmake/README-MSYS2.md 的 Note同时注意关闭它会导致thriftnb非阻塞服务器与依赖它的测试不被构建lib/cpp/CMakeLists.txt、CMakeLists.txt。WITH_SHARED_LIB/WITH_STATIC_LIB的弃用警告这两个选项在新版 CMake 中已弃用改用-DBUILD_SHARED_LIBSOFF静态或-DBUILD_SHARED_LIBSON共享即可二者不能同时为 ON见 DefineOptions.cmake。编译器/工具找不到检查~/.bash_profile中的export PATH/mingw64/bin:$PATH是否生效并确认新开的 shell 已加载该配置同时确认CMAKE_MAKE_PROGRAM指向/mingw64/bin/mingw32-make。历史参考若遇到 MinGW64/MSYS2 相关的构建问题可查阅 Apache Jira 的 THRIFT-4046 及其相关补丁原文明确指出的已知问题跟踪条目MSYS 环境下concurrency_test随机失败的问题可参考 THRIFT-4106见 build/appveyor/MSYS-appveyor-full.bat。非阻塞服务器缺失在 MSYS2/MinGW64 方案中libthriftnb非阻塞服务器不会被构建这是已知且预期的行为。若你的业务强依赖非阻塞服务器应改用 MSVCVisual Studio方案或 Linux 环境。六、小结在 Windows 上通过 MSYS2/MinGW64 构建 Apache Thrift 的完整路径可归纳为四步升级 MSYS2 → 用 pacman 安装 MinGW 工具链与第三方库 → 配置 PATH → out-of-tree 执行 cmake 配置、构建与 ctest。其中-DWITH_LIBEVENTOFF规避 MinGW 下 libevent 的兼容性问题与-DWITH_STATIC_LIBON产出静态库是该场景最关键的配置决策其余语言开关JAVA/PYTHON/PERL按需关闭即可精简构建。仓库内 build/appveyor/MINGW-appveyor-full.bat 提供了与文档完全一致的自动化范本DefineOptions.cmake 则集中定义了全部可调选项是排查与定制构建行为时的第一手参考资料。【免费下载链接】thriftApache Thrift项目地址: https://gitcode.com/GitHub_Trending/thr/thrift创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考