问题描述
我正在创建一个独立的 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 放在同一目录中。