【问题标题】:Qt MySQL can't load plugin driver (QLibrary, QPluginLoader successfully loaded, QSqlDatabase::drivers() return empty!)Qt MySQL无法加载插件驱动(QLibrary,QPluginLoader成功加载,QSqlDatabase::drivers()返回空!)
【发布时间】:2013-01-16 16:18:57
【问题描述】:

我已成功编译 MySQL 驱动程序,但我无法强制 Qt 加载它们。

一开始应该说的我得到了ODBC和SQLite驱动程序包(安装Qt之后),它们也没有被检测到。

在 *C:\Qt\4.8.0\plugins\sqldrivers* 我得到了:

qsqlite4.dll

qsqlite4.lib

qsqlited4.dll

qsqlited4.lib

qsqlmysql4.dll

qsqlmysql4.lib

qsqlmysqld4.dll

qsqlmysqld4.lib

qsqlodbc4.dll

qsqlodbc4.lib

qsqlodbcd4.dll

qsqlodbcd4.lib

qsqlpsql4.dll

qsqlpsql4.lib

qsqlpsqld4.dll

qsqlpsqld4.lib

我也放入的 qsqlmysql*.* 文件:

C:\Qt\4.8.0\bin

应用程序\

应用\调试\

应用\发布\

应用\sqldrivers\

当然,我也安装了 QtSql*.dll。

我已经正确配置了 .pro:

QT += 核心gui网络sql

我正在运行这段代码:

#include <QSqlRecord>
#include <QSqlError>

QLibrary mysqllib("qsqlmysqld4.dll");
mysqllib.load();
auto t1 = mysqllib.isLoaded();
qDebug()<<"my library loaded"<<mysqllib.isLoaded();

QPluginLoader plug("qsqlmysqld4.dll");
plug.load();
auto t2 = plug.isLoaded();
qDebug()<<"mysql plugin is loaded"<<plug.isLoaded();

ui->textEditContent->append( "--SQL DRIVERS SUPPORTED:--\n" );
FOREACH( auto driver, QSqlDatabase::drivers() )
    ui->textEditContent->append( "  " + driver + "\n" );

QLibrary 和 QPluginLoader 返回 true。而 QSqlDatabase::drivers() 是空的。 我做错了什么? Qt 看不到 C:\Qt\4.8.0\plugins\sqldrivers 中的所有驱动程序。 Iv 使用相同的编译器 (MSVC2010) 编译 Qt 和 SQL 驱动程序,没有错误。我正在运行我的代码几个月。任务是添加 MySQL 支持。

【问题讨论】:

    标签: mysql qt plugins driver qtsql


    【解决方案1】:

    问题解决了! 我已经修改了代码,现在看起来是这样的:

    #include <QSqlRecord>
    #include <QSqlError>    
    
    QStringList liblist;
    liblist.push_back("c:/Qt/4.8.0/plugins/");
    liblist.push_back("c:/Qt/4.8.0/bin/");
    QCoreApplication::setLibraryPaths(liblist);
    
    QLibrary mysqllib("qsqlmysqld4.dll");
    mysqllib.load();
    auto t1 = mysqllib.isLoaded();
    qDebug()<<"my library loaded"<<mysqllib.isLoaded();
    
    QPluginLoader plug("qsqlmysqld4.dll");
    plug.load();
    auto t2 = plug.isLoaded();
    qDebug()<<"mysql plugin is loaded"<<plug.isLoaded();
    
    ui->textEditContent->append( "--SQL DRIVERS SUPPORTED:--\n" );
    FOREACH( auto driver, QSqlDatabase::drivers() )
        ui->textEditContent->append( "  " + driver + "\n" );
    

    似乎即使 Qt 有指向它自己的文件夹的路径,您也需要在加载驱动程序之前指定它们。 您可以通过添加这些行来做到这一点:

    QStringList liblist;
    liblist.push_back("c:/Qt/4.8.0/plugins/");
    liblist.push_back("c:/Qt/4.8.0/bin/");
    QCoreApplication::setLibraryPaths(liblist);
    

    如果您想像我一样将这些驱动程序包含到您的应用程序文件夹中,您可以在应用程序的根目录中创建文件夹“sqldrivers”并将路径添加到该根目录。 所以我们有 libmysql.dll 和 qsqlmysql.dll 在:

    X:\APPLICATION\sqldrivers\

    代码如下所示:

    QStringList liblist;
    liblist.push_back(QDir::currentPath()); // Qt always looks for those drivers in <LIB_FOLDER_SPECIFIED>/sqldrivers/
    //liblist.push_back("e:/Qt/4.8.0/bin/");
    //liblist.push_back("e:/Qt/4.8.0/plugins/");
    QCoreApplication::setLibraryPaths(liblist);
    

    【讨论】:

    • +1:感谢 QCoreApplication::setLibraryPaths(liblist);库/插件加载在我的 PC 上不起作用,但驱动程序仍然可用。看来设置路径就够了。
    • 感谢有关“sqldrivers”子目录的提示。我将此子目录添加到我的应用程序的 EXE 输出目录中,并复制了 libmysql.dll 和 qsqmysql4.dll(Debug 的“d”变体),效果很好!我什至不必在我的应用中添加任何代码来加载它们。
    【解决方案2】:

    你还需要一个 libmysql.dll

    C:\Qt\4.8.0\bin
    
    APPLICATION\
    
    APPLICATION\Debug\
    
    APPLICATION\Release\
    

    【讨论】:

    • libmysql.dll 存在并已加载。 msvc 的输出:“ELF_2013-01-16.exe”:已加载“F:\SRC_ELF\ProjectStructure\src\app\Debug\qsqlmysqld4.dll”,已加载符号。 “ELF_2013-01-16.exe”:已加载“F:\SRC_ELF\ProjectStructure\src\app\Debug\libmysql.dll”,已加载符号。 “ELF_2013-01-16.exe”:已加载“C:\Windows\SysWOW64\secur32.dll”,无法找到或打开我的库加载的 PDB 文件真正的“ELF_2013-01-16.exe”:已加载“F:\ SRC_ELF\ProjectStructure\src\app\qsqlmysqld4.dll',已加载符号。 mysql plugin is loaded true QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers:
    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多