QMYSQL插件已存在,Qt程序仍报“Driver not loaded”问题求助
Qt 6.7.2 macOS下QMYSQL插件识别但无法被QSqlDatabase使用的问题解决
环境信息
- Qt 6.7.2(运行于macOS 12.7.6,x86_64架构)
- MySQL 8.0.34
- 已通过CMake编译
libqsqlmysql.dylib,并安装至~/Qt/6.7.2/macos/plugins/sqldrivers/目录
问题现象
QPluginLoader可正常加载libqsqlmysql.dylib,但QSqlDatabase无法使用该驱动- 输出显示可用驱动列表包含QMYSQL,但调用
addDatabase("QMYSQL")后,数据库实例的driverName为空、isValid返回false,报错信息为"Driver not loaded" - 移除插件后,可用驱动列表中的QMYSQL条目消失,说明Qt已识别到该插件
关键代码与输出
项目.pro配置
QT += core gui sql greaterThan(QT_MAJOR_VERSION, 4): Qt += widgets TARGET = AppName TEMPLATE += app DEFINES += QT_DEPRECATED_WARNING QT_DISABLE_DEPRECATED_BEFORE=0x60000 ...
MainWindow构造函数关键代码
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); _db = new QSqlDatabase; _db->addDatabase ("QMYSQL", "only"); qDebug () << "Available SQL Drivers :: " << _db->drivers (); qDebug () << "_db->driverName () == " << _db->driverName (); qDebug () << "_db->isValid () == " << _db->isValid (); qDebug () << "_db->lastError () == " << _db->lastError (); qDebug () << "_db->isDriverAvailable (\"QMYSQL\") == " << _db->isDriverAvailable ("QMYSQL"); QPluginLoader mysqlPlugin = QPluginLoader ("/Users/lamontp/Qt/6.7.2/macos/plugins/sqldrivers/libqsqlmysql.dylib", this); mysqlPlugin.load (); qDebug () << "mysqlPlugin.isLoaded () == " << mysqlPlugin.isLoaded (); qDebug () << "mysqlPlugin.errorString () == " << mysqlPlugin.errorString (); }
应用输出
Available SQL Drivers :: QList("QSQLITE", "QMARIADB", "QMYSQL", "QODBC", "QPSQL", "QMIMER") _db->driverName () == "" _db->isValid () == false _db->lastError () == QSqlError("", "Driver not loaded", "Driver not loaded") _db->isDriverAvailable ("QMYSQL") == true mysqlPlugin.isLoaded () == true mysqlPlugin.errorString () == "Unknown error"
QT_DEBUG_PLUGINS输出片段
qt.core.plugin.factoryloader: looking at "/Users/lamontp/Qt/6.7.2/macos/plugins/sqldrivers/libqsqlmysql.dylib" qt.core.plugin.loader: Found metadata in lib /Users/lamontp/Qt/6.7.2/macos/plugins/sqldrivers/libqsqlmysql.dylib, metadata= { "IID": "org.qt-project.Qt.QSqlDriverFactoryInterface", "MetaData": { "Keys": [ "QMYSQL", "QMARIADB" ] }, "archlevel": 2, "className": "QMYSQLDriverPlugin", "debug": false, "version": 395008 } qt.core.plugin.factoryloader: Got keys from plugin meta data QList("QMYSQL", "QMARIADB")
已尝试的排查步骤
- 切换Release/debug模式编译插件与应用,问题未解决
- 确认插件路径正确,Qt可识别插件
解决方案建议
修正QSqlDatabase实例初始化方式
addDatabase是静态方法,不能通过未初始化的QSqlDatabase指针调用,正确写法:// 方式1:通过静态方法返回的实例初始化指针 _db = new QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL", "only")); // 方式2:直接使用栈实例 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "only");检查MySQL依赖库加载情况
- 使用
otool -L libqsqlmysql.dylib查看插件依赖的MySQL库路径,确保路径指向已安装的MySQL 8.0.34库 - 若依赖路径错误,用
install_name_tool修改:install_name_tool -change @rpath/libmysqlclient.21.dylib /usr/local/mysql/lib/libmysqlclient.21.dylib ~/Qt/6.7.2/macos/plugins/sqldrivers/libqsqlmysql.dylib
- 使用
验证架构匹配性
- 用
lipo -info libqsqlmysql.dylib查看插件架构,用lipo -info AppName查看应用架构,确保两者均为x86_64
- 用
指定Qt运行时插件路径
运行应用前设置环境变量:export QT_PLUGIN_PATH=~/Qt/6.7.2/macos/plugins ./AppName最小化测试代码
编写无干扰的基础连接代码,排除其他业务代码影响:#include <QCoreApplication> #include <QSqlDatabase> #include <QSqlError> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("test_db"); db.setUserName("root"); db.setPassword("your_password"); qDebug() << "Driver available:" << QSqlDatabase::isDriverAvailable("QMYSQL"); qDebug() << "Attempting to connect..."; if (db.open()) { qDebug() << "Connected successfully!"; db.close(); } else { qDebug() << "Connection failed:" << db.lastError().text(); } return a.exec(); }
内容的提问来源于stack exchange,提问作者Lamont Peterson
相关产品推荐
相关产品推荐

