Не удается загрузить sqlite.dll с плагином QSQLITE2 Qt

Я использую 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-2my3.dll17.zip - так что это официальная сборка, но это точно такой же файл, который был у меня, и он также не работает.


person Googie    schedule 04.02.2014    source источник
comment
Еще одно замечание: sqlite.h определяет extern const char sqlite_encoding[], который не определен в sqlite.dll (я не смог скомпилировать плагин QSQLITE2), поэтому мне нужно отредактировать файл qsql_sqlite2.cpp и добавить строку: const char sqlite_encoding[] = "UTF-8"; - тогда плагин Qt скомпилирован правильно. Я не уверен, что это актуально, но просто хотел быть точным.   -  person Googie    schedule 04.02.2014


Ответы (1)


Оказалось, что qsqlite2d.dll нельзя слинковать с sqlite.dll, так как sqlite.dll не компилируется в режиме отладки. После перекомпиляции приложения в режиме релиза (таким образом, используя qsqlite2.dll, а не qsqlite2d.dll) плагин корректно загружается и работает.

Это имеет смысл, но меня беспокоит еще одна вещь: qsqlited.dll (для sqlite3) без проблем линкуется с sqlite3.dll. Неважно, скомпилировал я отладку или релиз — сингл sqlite3.dll работал как с отладочными, так и с релизными плагинами. Кто-нибудь знает, как это возможно? Пожалуйста, прокомментируйте, если вы это сделаете, я был бы признателен.

person Googie    schedule 04.02.2014