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。
备注:内容仅供参考。
