Qt项目需手动添加MySQL驱动支持:确认架构一致、放置客户端库、补全sqldrivers插件;Linux常需手动编译qsqlmysql插件;连接前须调用addDatabase并设置完整参数,注意MySQL 8.0认证插件兼容性及DLL依赖路径问题。

Qt 项目中添加 MySQL 驱动支持(Windows / Linux)
Qt 默认不自带 MySQL 插件,QSqlDatabase::addDatabase("QMYSQL") 会失败,报错 "QMYSQL driver not loaded" 或 "Driver not loaded"。核心原因是:Qt 编译时没链接 MySQL 客户端库,或运行时找不到 libmysql.dll(Windows)或 libmysqlclient.so(Linux)。
实操分三步:确认 Qt 版本与 MySQL 库架构一致(x64/x86)、把 MySQL 客户端动态库放到可加载路径、在 Qt 构建目录中补全 sqldrivers/qsqlmysql.dll(Windows)或 .so(Linux)。
- Windows 下优先用 MySQL 官方提供的
libmysql.dll(不是mysqlclient.lib静态库),版本建议与服务端一致(如 MySQL 8.0.33 → 用对应版本的库) - Linux 下需安装
libmysqlclient-dev(Ubuntu/Debian)或mariadb-devel(CentOS/RHEL),再重新编译 Qt 的qsqlmysql插件 - Qt Creator 中检查
QT_DEBUG_PLUGINS=1环境变量,运行时可看到插件加载失败的具体原因(比如找不到libssl.so.1.1)
手动编译 qsqlmysql 插件(Linux 常见场景)
多数 Linux 发行版 Qt 包不含 MySQL 插件,且系统级 MySQL 开发包路径不统一,必须自己编译。关键不是“能不能连”,而是“插件有没有被 Qt 正确识别并加载”。
假设 Qt 安装在 /opt/Qt/6.5.3/gcc_64,MySQL 头文件和库在 /usr/lib/x86_64-linux-gnu/libmysqlclient.so 和 /usr/include/mysql:
立即学习“C++免费学习笔记(深入)”;
Difeye是一款超轻量级PHP框架,主要特点有: Difeye是一款超轻量级PHP框架,主要特点有: ◆数据库连接做自动主从读写分离配置,适合单机和分布式站点部署; ◆支持Smarty模板机制,可灵活配置第三方缓存组件; ◆完全分离页面和动作,仿C#页面加载自动执行Page_Load入口函数; ◆支持mysql,mongodb等第三方数据库模块,支持读写分离,分布式部署; ◆增加后台管理开发示例
cd /opt/Qt/6.5.3/Src/qtbase/src/plugins/sqldrivers/mysql qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/x86_64-linux-gnu -lmysqlclient" mysql.pro make sudo make install
生成的 libqsqlmysql.so 会被复制到 /opt/Qt/6.5.3/gcc_64/plugins/sqldrivers/。注意:qmake 必须用当前 Qt 版本的,不能混用;LIBS 中的 -lmysqlclient 依赖 OpenSSL 和 zlib,若报 undefined reference to SSL_*,需加 -lssl -lcrypto。
Qt C++ 连接代码里容易漏掉的初始化项
QSqlDatabase 对象本身不自动触发驱动加载,必须显式调用 QSqlDatabase::addDatabase("QMYSQL"),且要在创建任何 QApplication 实例之前(尤其在子线程中使用时)。
- 必须设置
setHostName()、setDatabaseName()、setUserName()、setPassword(),缺一不可;空密码不能传nullptr,得传空字符串"" - MySQL 8.0+ 默认认证插件是
caching_sha2_password,Qt 5.12+ 支持,但旧 Qt(如 5.9)会连接失败,错误信息类似"Authentication plugin 'caching_sha2_password' cannot be loaded"—— 此时需在 MySQL 侧执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 连接后务必检查
db.open()返回值,不要只看lastError()字符串是否为空,有些底层错误(如 DNS 解析超时)会静默失败
Qt + MySQL 在 Windows 上 DLL 加载路径陷阱
即使 qsqlmysql.dll 已放在 plugins/sqldrivers/,仍可能报 "Driver not loaded" —— 因为该 DLL 依赖 libmysql.dll,而 Windows 不会从插件目录自动搜索其依赖项。
- 最稳方案:把
libmysql.dll复制到 Qt 可执行文件所在目录(即build-xxx/Debug/或build-xxx/Release/),不是plugins/目录 - 次选方案:把
libmysql.dll所在路径加进系统PATH,但调试时容易混淆不同版本(比如同时装了 XAMPP 和 MySQL Server) - 绝对避免:用
QCoreApplication::addLibraryPath()添加插件路径——它只影响插件本身,不影响插件的 DLL 依赖
用 Dependency Walker(Windows)或 ldd qsqlmysql.dll(Linux)查实际缺失的依赖,比猜更可靠。









