QMYSQL 插件可用但仍然提示“驱动程序未加载”

问题描述 投票:0回答:1

我正在使用 Qt 编写一个用于前端 MySQL 的 C++ 应用程序(稍后,将会有一个客户端-服务器拆分,其中数据库只能由 Linux 上的服务器守护程序和其他任何客户端访问;只是从基本的独立客户端类型开始事物)。 我似乎无法让 QSqlDatabase 实际加载实际可用的 QMYSQL 插件。

Qt 6.7.2。在 Mac 上(macOS 12.7.6,x86_64,是的,这是较旧的硬件)。 MySQL 8.无论安装什么。

我使用 cmake 构建了 libqsqlmysql.dylib 文件(和其他文件)并将它们安装到正确的 ~/Qt/6.7.2/macos/plugins/sqldrivers/ 文件夹中。 据我所知,它构建了“debug_and_release”(我使用 QPluginLoader 编写了一些测试代码,它可以很好地加载它,但 QSqlDatabase 仍然无法使用它)。

项目 .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.cpp 文件包括:

#include "MainWindow.h"
#include "ui_MainWindow.h"

#include <QSettings>
#include <QCloseEvent>
#include <QMessageBox>
#include <QSqlError>
#include <QLibraryInfo>
#include <QPluginLoader>

// ... and #include statements for app specific code, dialogs, etc.

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");

    qDebug () << "QLibraryInfo::isDebugBuild () == " << QLibraryInfo::isDebugBuild ();
    qDebug () << "QLibraryInfo::isSharedBuild () == " << QLibraryInfo::isSharedBuild ();
    qDebug () << "QLibraryInfo::path (QLibraryInfo::PluginsPath" << QLibraryInfo::path (QLibraryInfo::PluginsPath);
    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 ();

    ReadSettings();
    setUnifiedTitleAndToolBarOnMac (true);
}

“应用程序输出”显示:

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
QLibraryInfo::isDebugBuild () ==  false
QLibraryInfo::isSharedBuild () ==  true
QLibraryInfo::path (QLibraryInfo::PluginsPath "/Users/lamontp/Qt/6.7.2/macos/plugins"
mysqlPlugin.isLoaded () ==  true
mysqlPlugin.errorString () ==  "Unknown error"

QMYSQL 驱动程序可用(如果我从 plugins/sqldrivers/ 目录中删除 libqsqlmysql.dylib 文件并再次运行代码,它就会从该列表中消失)。

我使用 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")

似乎是说这是一个仅限发布的构建,所以我切换到构建发布,但它仍然不起作用。 事实上,我也没有 libqsqlmysql_debug.dylib 文件(为什么当 cmake 说它正在这样做时没有构建它?)。

我遵循了我能找到的所有文档,这些文档都是针对人们尚未构建 QMYSQL 驱动程序的问题,但我已经构建了它。 尽管驱动程序可用,但我找不到任何关于该驱动程序实际上无法在 QSqlDatabae 中工作的信息。

我通读了该网站上能找到的所有内容,但没有一个有任何区别。

我花了大约一周的晚上和周末的时间在这里、Qt 的文档和整个互联网上到处搜索。 驱动程序已构建并位于正确的位置。 我已经测试过用 QPluginLoader 加载它,用所有 QLibrary、QLibraryInfo 等类探测它,这些类表明它很好),我手动将 plugins/ 目录和 sqldrivers/ 目录放入 Debug 和 Release 构建文件夹中,尝试了目录结构的各种排列;它仍然不起作用。 我想我已经完成了这里可以完成的所有尽职调查。 显然,我错过了一些东西,但我当然没有看到任何关于它可能是什么的有用信息。 调试器没有帮助我找到它实际上没有加载的原因。

请:

GRANT INSIGHT TO 'thisuser' ON my_weird_question;
c++17 mysql-connector qsqldatabase
1个回答
0
投票

我通过告诉

libqsqlmysql_debug.dylib
通过设置
qt-cmake
专门运行调试构建来构建
-DCMAKE_BUILD_TYPE=Debug
(我还切换到使用服务器安装(MySQL的安装程序)中的
libmysql.21.dylib
文件,而不是来自客户端安装(brew)。这让我花了一些时间在调试器上,我发现我所做的
libmysqlclient.24.dylib
调用实际上返回了正确的对象,所以我决定重构我的操作方式并让它工作。主要是,
_db->addDatabase ("QMYSQL", "only");
私有成员现在是
QSqlDatabase *_db
(不再是指针,而是对象本身)。
这是我的 

QSqlDatabase _db

构造函数顶部的工作代码:

QMainWindow

当然,我将所有 
QSqlDatabase::addDatabase ("QMYSQL", "only"); _db = QSqlDatabase::database ("only");

更改为

_db->
,并从析构函数中删除了
_db.
    

© www.soinside.com 2019 - 2024. All rights reserved.