2014-02-04 3 views
0

Я использую QtCreator + mingw.Не удается загрузить sqlite.dll с QSQLITE2 Qt-плагином

Я скомпилировал плагин 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.

Какие-либо намеки, что может быть неправильно? Что еще я могу проверить?

EDIT:

Я только что выполнил тест: Я удалил my.dll из плагинов, чтобы избежать загрузки вообще. Затем я добавил код main.cpp:

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

Дело в том, что он также упал, с тем же трассировки стека (в этой самой линии, я отлажена его). Таким образом, я думаю, что что-то не так с плагином sqlite2 Qt, но я все еще не могу сказать, что. Я искал для другого sqlite.dll, я только что загрузил его с сайта sqlite.org: http://www.sqlite.org/sqlitedll-2_8_17.zip - так что это официальная сборка, но это тот же самый файл, который у меня был, и он тоже терпит неудачу.

+0

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

ответ

0

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

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