mysql Qt连接mysql方法_mysql C++类库配置

17次阅读

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

mysql Qt连接mysql方法_mysql C++类库配置

Qt 项目中添加 MySQL 驱动支持(windows / Linux)

Qt 默认不自带 MySQL 插件,QSqlDatabase::addDatabase("QMYSQL") 会失败,报错 "QMYSQL driver not loaded""Driver not loaded"。核心原因是:Qt 编译时没链接 MySQL 客户端库,或运行时找不到 libmysql.dllwindows)或 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-devubuntu/debian)或 mariadb-develcentos/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++免费学习笔记(深入)”;

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)查实际缺失的依赖,比猜更可靠。

text=ZqhQzanResources