MySQL 8.0源码编译必须显式指定Boost顶层目录路径,不可依赖系统安装或自动查找;须使用匹配版本(如1.73.0–1.79.0)的完整Boost源码树,通过-DWITH_BOOST=/path/to/boost指向其根目录,并验证cmake输出中出现“Found Boost”及正确版本号。

编译MySQL 8.0必须显式指定Boost路径
MySQL 8.0 强依赖 Boost,且不接受系统默认查找——cmake 不会自动扫描 /usr/include/boost 或 /usr/local/include/boost。哪怕你已用 apt install libboost-all-dev 或 yum install boost-program-options 装了系统 Boost,编译仍大概率报错:CMake Error: Could not find boost headers 或 Cannot find required Boost libraries。
根本原因是:MySQL 8.0 要求的 Boost 版本严格(如 8.0.32 要求 1.73.0~1.79.0),而发行版仓库的 Boost 版本往往不匹配,或缺失部分组件(如 boost_system、boost_thread)。
- 优先下载带
boost的官方源码包,例如mysql-boost-8.0.32.tar.gz,解压后 Boost 就在boost/子目录下 - 若用纯
mysql-8.0.32.tar.gz,必须手动下载对应 Boost 源码、编译安装,并在cmake中用-DWITH_BOOST=指向其根目录(不是include/子目录) -
-DDOWNLOAD_BOOST=1看似省事,但实际常因网络或权限失败,且无法控制版本,不建议生产环境使用
cmake 中 -DWITH_BOOST 的写法必须精确
-DWITH_BOOST 的值不是头文件路径,也不是库文件路径,而是 Boost 源码解压后的**顶层目录路径**(即包含 boost/ 子目录和 libs/ 的那个目录)。常见错误写法:
-
-DWITH_BOOST=/usr/include/boost→ 错,这是头文件安装路径,cmake 找不到bootstrap.sh -
-DWITH_BOOST=/usr/local/boost/include→ 错,cmake 会尝试在该路径下找boost/version.hpp,但还要求有libs/和构建支持 -
-DWITH_BOOST=/path/to/mysql-8.0.32/boost→ 对,这是官方打包自带的 Boost 目录 -
-DWITH_BOOST=/usr/local/src/boost_1_73_0→ 对,前提是该目录是完整解压 + 运行过./bootstrap.sh的源码树
验证是否生效:运行 cmake . -DWITH_BOOST=... 后,检查输出中是否出现类似:
-- BOOST_INCLUDE_DIR = /path/to/boost -- Found Boost: ... (found version "1.73.0")
若只显示 Could NOT find Boost,说明路径不对或 Boost 缺组件。
用 mysql-boost-* 包时仍需确认 boost/ 目录存在
即使下载的是 mysql-boost-8.0.32.tar.gz,解压后也请手动检查:ls -d mysql-8.0.32/boost 是否存在且非空。某些镜像站提供的“boost 包”实际只是打了标记,内部 boost/ 是空目录或软链接失效。
- 进入源码目录后,先执行
ls -l boost;如果看到boost -> /some/path,需rm boost && cp -r /path/to/real/boost ./boost - 若
boost/下只有cmake/和doc/,说明缺失源码,得重下或补全 - 不要跳过
cd mysql-8.0.32 && ls boost/这一步——这是最常被跳过的验证动作
Boost 版本不匹配会导致 make 阶段失败
cmake 成功不代表万事大吉。make 过程中可能突然报错:
error: ‘boost::filesystem::status’ has not been declared
或
undefined reference to `boost::system::generic_category()'
这类错误基本都源于 Boost 版本与 MySQL 源码预期不符。MySQL 8.0.x 各小版本对 Boost 的 ABI 兼容性很敏感:
- 8.0.28–8.0.32 推荐 Boost 1.73.0~1.79.0
- 用 1.80+ 会触发 C++20 特性冲突(如
std::span替代boost::span) - 用 1.65 或更老版本,
boost::asio缺少 required symbol
解决办法不是升级 GCC,而是换 Boost 源码重新配置。别指望加 -DBOOST_NO_CXX11_SCOPED_ENUMS 之类宏能绕过——MySQL 内部硬编码依赖特定 Boost 接口。


















