You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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可识别插件

解决方案建议

  1. 修正QSqlDatabase实例初始化方式
    addDatabase是静态方法,不能通过未初始化的QSqlDatabase指针调用,正确写法:

    // 方式1:通过静态方法返回的实例初始化指针
    _db = new QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL", "only"));
    // 方式2:直接使用栈实例
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "only");
    
  2. 检查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
      
  3. 验证架构匹配性

    • 用lipo -info libqsqlmysql.dylib查看插件架构,用lipo -info AppName查看应用架构,确保两者均为x86_64
  4. 指定Qt运行时插件路径
    运行应用前设置环境变量:

    export QT_PLUGIN_PATH=~/Qt/6.7.2/macos/plugins
    ./AppName
    
  5. 最小化测试代码
    编写无干扰的基础连接代码,排除其他业务代码影响:

    #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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:05:05