0

我使用 QtCreator + mingw。

我已经编译了 QSQLITE2 插件。我只是在 Qt 源代码中输入了插件目录:

c:\Qt\Qt5.2.0\5.2.0\Src\qtbase\src\plugins\sqldrivers\sqlite

我用我在本地拥有的 sqlite 2.8.17 构建了它(作为 dll 和标题):

qmake "LIBS+=-Lc:\projects\lib -lsqlite" "INCLUDEPATH+=c:\projects\include"
make
make install

一切正常。

现在,我有另一个 DLL(也实现为 Qt 插件,一个自定义的),它使用 QSQLITE2 Qt 插件。我自己的 dll 也链接到 sqlite.dll。所以它看起来像这样:

my.dll                       depends on sqlite.dll
%QT_PLUGINS%\qsqlite2d.dll   depends on sqlite.dll
my.dll                       uses qsqlite2d.dll through Qt's plugin engine
myApp.exe                    loads my.dll

问题是我的应用程序无法加载 my.dll,因为invalid location access或类似的原因。我不知道任何细节,这就是问题所在。

sqlite.dll运行时位于应用程序目录中。

当我在调试模式下运行应用程序时,它在某个程序集文件中崩溃,但在堆栈跟踪中我可以看到它位于 sqlite.dll 内的某处,在 sqlite_step 符号中。这是我所知道的一切。

注意 1)我有另一个插件 dll,my3.dll它使用 QSQLITE 插件(它用于 sqlite3)并与之链接,sqlite3.dll并且这个加载得很好。我自己也编译了 QSQLITE 插件(即使有 Qt 提供的插件,那是因为 Qt 静态链接到 sqlite3 而我希望它动态链接到sqlite3.dll)。

注 2)这两个插件在 Linux 下都可以正常工作。

任何提示可能有什么问题?我还能检查什么?

编辑:

我刚刚进行了一个测试:我my.dll从插件中删除以避免加载它。然后我将代码添加到main.cpp

    QSqlDatabase::addDatabase("QSQLITE2", ":memory:");

事情是,它也崩溃了,具有相同的堆栈跟踪(在这一行,我调试了它)。因此我认为 sqlite2 Qt 插件有问题,但我仍然无法判断是什么。我查找了其他sqlite.dll,我刚刚从 sqlite.org 下载了一个:http ://www.sqlite.org/sqlitedll-2_8_17.zip - 所以它是官方构建,但它与我拥有的完全相同的文件,它也失败了一样的方法。

4

1 回答 1

0

原来qsqlite2d.dll无法链接sqlite.dll,因为sqlite.dll不是在调试模式下编译的。在发布模式下重新编译应用程序后(因此使用qsqlite2.dll, not qsqlite2d.dll),插件正确加载并工作。

这是有道理的,但还有一件事让我qsqlited.dll感到困扰 - (对于 sqlite3)与sqlite3.dll. 无论我是编译调试还是发布 - 单曲sqlite3.dll都适用于调试和发布插件。任何人都知道这怎么可能?如果您这样做,请发表评论,我将不胜感激。

于 2014-02-04T15:44:06.460 回答