Приложение QtSql не работает на развернутой машине
Я сделал программное обеспечение на Qt/C++. Мне нужно развернуть его в Windows 7 (64-разрядная версия), которая также является хостом, на котором я разработал программное обеспечение.
Проблема заключается в том, что мое программное обеспечение может взаимодействовать с базой данных sqlite на разработанном компьютере, но когда я пытаюсь развернуть свое программное обеспечение на другом компьютере, оно не может взаимодействовать с базой данных там. Я тоже пытался использовать "Запуск от имени администратора", но это не помогло. Я также пытался использовать режим совместимости.
База данных расположена локально по адресу C:\Users\username\Desktop\db1.sqlite
таким образом, для правильной работы моего программного обеспечения не требуется никаких сетей или Интернета.
Я также включил QtGui4
, QtCore
, а также QtSql4
DLL с моим программным обеспечением.
Может кто-то указать, что здесь может пойти не так?
2 ответа
Правильно, поэтому есть несколько вещей, которые нужно обсудить, прежде чем предлагать решение, а именно:
1) Когда вы разрабатываете программное обеспечение на компьютере под управлением Windows, и оно работает как прелесть, но не на машинах, на которых вы развернули свое программное обеспечение, первое, что нужно проверить, - это зависимости. Они все отправлены правильно?
Как бы я пошел, чтобы проверить это? Ну, это и есть цель свободно доступного обходчика зависимостей. Вы должны работать на компьютере, на котором вы развернули программное обеспечение; другими словами после развертывания. Не запускайте его на компьютере разработчика, если он там работает. Хорошо, речь идет об отладке, поэтому давайте определимся с Qt...
2) Вы используете модуль QtSql для управления взаимодействием с базой данных, что хорошо в приложении Qt. Тем не менее, основная динамическая библиотека, ака. QtSql4.dll о абстрактной функциональности. То есть весь код Qt не имеет отношения к конкретным драйверам.
Вы можете спросить, почему это так? Причина относительно проста, так как модуль QtSql предоставляет абстрактный интерфейс, должна быть возможность изменить механизм хранения базы данных на лету, не перестраивая и не развертывая ваше программное обеспечение. Что если конечный пользователь решит однажды использовать другую базу данных? Это было бы невозможно без этого.
Правильно, мы приближаемся к общему принципу дизайна, который называется Плагин Архитектура. Проект Qt имеет здесь документацию об этом. Теперь мы очень близки к решению, поэтому давайте сделаем еще один шаг к концу.
3) Это могла бы быть часть "слишком длинная; не читать": когда вы развертываете свое приложение, вам также необходимо, чтобы у ваших конечных пользователей тоже были плагины. Это означает, что вам необходимо отправить оба типа sqls в этом контексте, QtSql4.dll, а также специальный плагин драйвера. Вы, очевидно, скучаете по позже. Поэтому подготовьтесь к тому, чтобы быть отправленным. Но что во-вторых, верно? Итак, вы, кажется, в настоящее время используете sqlite и Qt 4, поэтому для этого вам понадобится драйвер sqlite Qt 4.
Вы можете проверить драйверы Qt SQL Database здесь:
В зависимости от того, какую версию sqlite вы используете, у вас есть два варианта:
По сути, это то, как вы бы построили драйвер самостоятельно, если бы вам пришлось это сделать:
cd %QTDIR%\src\plugins\sqldrivers\sqlite
qmake "INCLUDEPATH+=C:/SQLITE/INCLUDE" "LIBS+=C:/SQLITE/LIB/SQLITE3.LIB" sqlite.pro
nmake
Как только у вас есть эта DLL, что, я уверен, вы уже делаете, если у вас уже есть программа, работающая на Windows, скопируйте qsqlite4.dll
$QTDIR\plugins\sqldrivers в sqldrivers
каталог рядом с вашим приложением, исполняемый файл. Qt автоматически подхватит Qt, если вы не возитесь с путями вручную, чего вам не следует делать.
4) С другой стороны, это совершенно общий подход, поэтому он будет работать для любого типа SQL, если вы замените sqlite на тот, который вам нужен.
Вы также должны положить qsqlite4.dll
в каталоге с именем sqldrivers
наряду с релизной версией исполняемого файла вашего приложения.