PAYATHON 2026

Fedora 上 Drogon 无法检测 MySQL,应如何配置?

排障赵师傅

结论

Drogon 1.9.12 的 MySQL 后端需要 MariaDB Connector/C 的头文件和客户端库。在 Fedora 上,安装 mariadb-connector-c-devel 后,用新的构建目录重新配置 Drogon。

数据库服务端可以继续使用 MySQL。MariaDB Connector/C 支持连接 MySQL,安装这个客户端开发包无需更换服务端。Drogon 1.9.12 构建配置、MariaDB Connector/C 文档

当前有两个问题需要处理:

  • mysql-community-devel 提供的 Oracle MySQL 客户端 API 不符合该版本 Drogon 的要求。
  • 检测曾经成功,编译时却提示声明缺失,需要核对编译器实际使用的头文件,排查头文件与库混用的情况。

为什么 pkg-config 能找到,Drogon 却找不到?

pkg-config --libs mysqlclient 成功,只说明系统中有对应的包元数据,可以给出链接参数。Drogon 1.9.12 自带的 FindMySQL.cmake 使用 find_path() 和 find_library() 搜索依赖,不通过这条 pkg-config 命令检测。

该模块在 Linux 上搜索的库名包括:

mysqlclient_r
mariadbclient
mariadb

其中没有普通的 mysqlclient,所以只有 /usr/lib64/mysql/libmysqlclient.so 时,默认搜索逻辑仍然找不到所需的库。Drogon 1.9.12 检测模块

还需要考虑 API 差异。mysql_real_query_start()、mysql_real_query_cont() 和 MYSQL_WAIT_READ 属于 MariaDB 的非阻塞客户端接口。Oracle MySQL 的异步查询接口使用 mysql_real_query_nonblocking() 等名称,不能直接替代这些调用。MariaDB 非阻塞接口文档、MySQL 异步查询接口文档

在 Oracle MySQL 头文件中找不到 mysql_real_query_start,不能据此判断开发包装错或文件损坏。换用 Oracle MySQL tarball 中的头文件,也解决不了这项 API 差异。

在 Fedora 上配置

1. 安装客户端开发包

安装 Fedora 仓库中的 Connector/C 开发包:

sudo dnf install mariadb-connector-c-devel

这个包提供构建 libmariadb 客户端程序所需的文件,具体路径以当前系统的安装结果为准。可参阅 Fedora 软件包说明,并用以下命令查看:

rpm -ql mariadb-connector-c-devel
pkg-config --modversion libmariadb
pkg-config --cflags --libs libmariadb

如果安装时出现文件冲突,先检查现有头文件由哪个包提供:

rpm -qf /usr/include/mysql/mysql.h

再根据 DNF 的冲突信息处理对应的开发包。CMake 检测的是本地开发文件,无需为此停止数据库服务、卸载服务端或执行 dnf autoremove。

2. 使用新的构建目录

在 Drogon 1.9.12 源码根目录执行以下命令,确保 build-mariadb 尚未用于构建:

cmake -S . -B build-mariadb \
  -DBUILD_ORM=ON \
  -DBUILD_MYSQL=ON \
  -DUSE_MYSQL=ON

cmake --build build-mariadb --parallel

使用新目录可以避免沿用先前缓存的 MySQL 路径。找到该后端依赖后,配置输出会包含:

-- Ok! We find mariadb!

这是该版本的正常提示,即使最终连接的是 MySQL 服务端,也会显示 mariadb。

BUILD_MYSQL 控制是否检测 MySQL 后端的依赖;设置 USE_MYSQL=ON 不能补齐缺失的依赖。Drogon 1.9.12 没有 USE_MARIADB 配置选项,传入它会出现未使用变量提示。Drogon 1.9.12 构建配置

3. 自动检测失败时,指定同一套头文件和库

先根据 rpm -ql 的输出确认文件位置。例如,Connector/C 头文件位于 /usr/include/mysql、库位于 /usr/lib64/libmariadb.so 时,可以用另一个全新的构建目录显式配置:

cmake -S . -B build-mariadb-explicit \
  -DBUILD_ORM=ON \
  -DBUILD_MYSQL=ON \
  -DUSE_MYSQL=ON \
  -DMARIADB_INCLUDE_DIRS:PATH=/usr/include/mysql \
  -DMYSQL_INCLUDE_DIRS:PATH=/usr/include/mysql \
  -DMYSQL_LIBRARIES:FILEPATH=/usr/lib64/libmariadb.so

cmake --build build-mariadb-explicit --parallel

这些路径必须指向 MariaDB Connector/C 的文件。目录名是 mysql,不代表其中的文件来自 Oracle MySQL。

该版本读取的变量是复数形式 MYSQL_INCLUDE_DIRS,原先传入的 MYSQL_INCLUDE_DIR 不会设置这个检测结果。模块找到 MARIADB_INCLUDE_DIRS 后会优先使用它,因此显式配置时,两个头文件变量应指向同一套文件。Drogon 1.9.12 检测模块

检测成功后仍提示 API 未声明怎么办?

如果配置时已经出现:

-- Ok! We find mariadb!

随后编译仍然报错:

mysql_real_query_start not declared
MYSQL_WAIT_READ not declared

就要检查编译器实际包含的 mysql.h。可能是链接库选中了 MariaDB,头文件却来自 Oracle MySQL,也可能仍在使用旧构建目录中的路径。

先查看缓存和完整编译命令:

rg '^(MARIADB_INCLUDE_DIRS|MYSQL_INCLUDE_DIRS|MYSQL_LIBRARIES):' \
  build-mariadb-explicit/CMakeCache.txt

cmake --build build-mariadb-explicit --verbose

检查编译命令中的 -I、-isystem 路径,留意 /usr/local/include、自定义 MySQL tarball 等位置是否仍参与搜索。必要时,使用相同的头文件搜索参数执行预处理,确认最终包含了哪个文件。

再检查实际使用的头文件中是否有相关声明:

rg -n 'mysql_real_query_start|MYSQL_WAIT_READ' /usr/include/mysql

如果 Connector/C 安装在其他目录,请替换为对应路径。MariaDB Connector/C 的 mysql.h 提供这些接口;如果实际参与编译的头文件中没有它们,需要继续核对文件来源和开发包内容。MariaDB Connector/C 头文件

是否属于 Fedora 或 Drogon 的已知问题?

仅凭这些日志,无法认定这是 Fedora 专属缺陷,也不能归因于 GCC 15.2.1。

Drogon 1.9.12 的检测模块主要检查头文件和库的路径是否存在,没有完整验证所需的非阻塞 API。因此,手动指定不兼容的头文件和库,可能使配置通过,随后在编译阶段失败。

这个版本需要 MariaDB 客户端库。排查时应核对客户端开发文件是否混用、CMake 变量名是否正确,以及是否沿用了旧缓存,再使用同一套 MariaDB Connector/C 头文件和库重新构建 Drogon。

备注:内容仅供参考。