我使用 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 - 所以它是官方构建,但它与我拥有的完全相同的文件,它也失败了一样的方法。