微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 QSqlDatabase::drivers() 在 Qt 共享库项目中使用时为空?

如何解决为什么 QSqlDatabase::drivers() 在 Qt 共享库项目中使用时为空?

我正在创建一个独立的 Qt 共享库。该库基本上充当执行 sqlite 查询的接口,因此它需要使用 QsqlDatabase 模块。库的源代码

wxsqlite3-interface.h:

#ifndef WXsqlite3INTERFACE_H
#define WXsqlite3INTERFACE_H

#include <QtCore/qglobal.h>

#if defined(WXsqlite3INTERFACE_LIBRARY)
#  define WXsqlite3INTERFACE_EXPORT Q_DECL_EXPORT
#else
#  define WXsqlite3INTERFACE_EXPORT Q_DECL_IMPORT
#endif

extern "C" WXsqlite3INTERFACE_EXPORT void init(const char *dbPath,const char *password);
extern "C" WXsqlite3INTERFACE_EXPORT const char *query(const char *strQuery);

#endif // WXsqlite3INTERFACE_H

wxsqlite3-interface.cpp:

#include "wxsqlite3-interface.h"
#include <QsqlDatabase>
#include <QsqlQuery>
#include <QsqlRecord>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>

void init(const char *dbPath,const char *password)
{
    qDebug() << "drivers" << QsqlDatabase::drivers();

    QsqlDatabase db = QsqlDatabase::addDatabase("sqlITECIPHER");
    db.setDatabaseName(dbPath);
    db.setPassword(password);
    db.setConnectOptions("QsqlITE_USE_CIPHER=rc4");
}

const char *query(const char *strQuery)
{
    QsqlQuery query(QsqlDatabase::database());
    query.exec(strQuery);

    QJsonArray result;
    while (query.next()) {
        const QsqlRecord rec = query.record();
        QJsonArray jsonRec;
        for (int i = 0; i < rec.count(); i++) {
            jsonRec << QJsonValue::fromVariant(rec.value(i));
        }
        result << jsonRec;
    }

    return QJsonDocument(result).toJson(QJsonDocument::Compact);
}

构建库后,如果我在 Qt 应用程序中运行 init 函数,一切正常。但是,如果我使用 ffi-napi 在 node.js 应用程序中运行它,则不会加载任何驱动程序。我也收到警告:

QsqlDatabase:加载驱动插件需要一个QCoreApplication实例

我在构建库并运行 windeployqt 后的目录是:

?wxsqlite3-interface
 ┣ ?sqldrivers
 ┃ ┣ ?qsqlite.dll
 ┃ ┣ ?qsqlodbc.dll
 ┃ ┣ ?qsqlpsql.dll
 ┃ ┗ ?sqlitecipher.dll
 ┣ ?Qt5Core.dll
 ┣ ?Qt5sql.dll
 ┗ ?wxsqlite3-interface.dll

在非 Qt 环境中使用库时,我是否缺少一些 dll?

解决方法

如果我像这样构建后重构目录,它会起作用:

?wxsqlite3-interface
 ┣ ?bin
 ┃ ┣ ?Qt5Core.dll
 ┃ ┣ ?Qt5Sql.dll
 ┃ ┗ ?wxsqlite3-interface.dll
 ┗ ?plugins
 ┃ ┗ ?sqldrivers
 ┃ ┃ ┣ ?qsqlite.dll
 ┃ ┃ ┣ ?qsqlodbc.dll
 ┃ ┃ ┣ ?qsqlpsql.dll
 ┃ ┃ ┗ ?sqlitecipher.dll

现在我可以通过 ffi-napi 使用 node.js 来加载 wxsqlite3-interface.dll。

我认为发生的情况是 Qt5Sql.dll 放在同一个文件夹中时找不到 sqldrivers 的相对路径。使用新结构,它模仿 Qt 的源文件夹并遵循 Qt5Sql.dll 的 sqldrivers 相对路径。

虽然我不确定为什么在构建可执行文件时将 sqldrivers 文件夹与 Qt5Sql.dll 放在同一目录中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。