我正在使用 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;
我通过告诉
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.
。