Приложение QtSql не работает на развернутой машине

Я сделал программное обеспечение в Qt/C++. Мне нужно развернуть его на Windows 7 (64-разрядная версия), которая также является хост-машиной, на которой я разработал программное обеспечение.

Проблема в том, что мое программное обеспечение может взаимодействовать с базой данных sqlite на разрабатываемой машине, но когда я пытаюсь развернуть свое программное обеспечение на какой-либо другой машине, оно не может взаимодействовать с базой данных там. Я тоже пытался использовать "Запуск от имени администратора", но это не помогло. Я также пытался использовать режим совместимости.

База данных расположена локально по адресу C:\Users\username\Desktop\db1.sqlite, поэтому для правильной работы моего программного обеспечения не требуется сеть или Интернет.

Я также включил библиотеки DLL QtGui4, QtCore и QtSql4 в свое программное обеспечение.

Может ли кто-нибудь указать, что здесь может быть не так?


person user3855415    schedule 19.07.2014    source источник
comment
Приятель, я сказал, что программное обеспечение может общаться с БД на разработанной машине. средства разговора могут выполнять операции с базой данных, такие как открытие, чтение, удаление и т. д. Каждая ошибка не обязательно должна быть в коде. Когда я сказал, что на разрабатываемой машине он работает так, как ожидалось, это означает, что код идеален.   -  person user3855415    schedule 19.07.2014
comment
Да, я запустил Dependency Walker перед развертыванием своего программного обеспечения. Я включил QtSql4.dll в саму папку exe. Нужно ли мне помещать ее в отдельную папку sqldrivers внутри папки exe?   -  person user3855415    schedule 19.07.2014
comment
Я отредактировал вопрос и представил подробный ответ, чтобы в будущем он мог стать надлежащим каноническим для этого типа проблемы.   -  person lpapp    schedule 19.07.2014
comment
@hyde: я думал о том, чтобы закрыть его как обман, но потом решил, что, возможно, имеет больше смысла закрыть это как обман, поскольку я представил подробный ответ, который, по общему признанию, можно было бы сделать и там, но в такой тег малого объема (что обидно), он вряд ли достигнет уровня других ответов, не говоря уже о том, чтобы быть принятым.   -  person lpapp    schedule 19.07.2014


Ответы (2)


Правильно, поэтому здесь есть несколько вещей, которые следует обсудить, прежде чем предлагать решение, а именно:

1) Когда вы разрабатываете программное обеспечение на компьютере с Windows, и оно прекрасно работает, но не на машинах, на которых вы развернули свое программное обеспечение, первое, что нужно проверить, — это зависимости. Все ли они отправлены должным образом?

Как бы я пошел, чтобы проверить это? В этом и заключается цель свободно доступного обходчика зависимостей. Вы должны работать на машине, на которой вы развернули программное обеспечение; другими словами, после развертывания. Не запускайте его на машине разработки, если он там работает. Хорошо, речь идет об отладке, так что давайте поговорим о Qt...

2) Вы используете модуль QtSql для обработки взаимодействия с базой данных, что хорошо в приложении Qt. Однако основная динамическая библиотека, она же. QtSql4.dll — это абстрагированная функциональность. То есть весь код Qt не связан с конкретными драйверами.

Вы спросите, почему так сделано? Причина относительно проста, поскольку модуль QtSql предоставляет абстрактный интерфейс, должна быть возможность изменять механизм хранения базы данных на лету без перестройки и повторного развертывания вашего программного обеспечения. Что, если конечный пользователь однажды решит использовать другую базу данных? Без этого было бы невозможно.

Правильно, мы приближаемся к общему принципу проектирования, который называется архитектурой плагинов. Документация по проекту Qt содержится здесь. Теперь мы очень близки к решению, поэтому давайте сделаем еще один шаг к концу.

3) Это могла быть часть «слишком длинная, не читайте»: когда вы развертываете свое приложение, вам нужно будет, чтобы ваши конечные пользователи также имели плагины. Это означает, что в этом контексте вам необходимо отправить оба типа sql, QtSql4.dll, а также специальный подключаемый модуль драйвера. Вы, видимо, упускаете из виду последнее. Поэтому подготовьтесь к отправке. Но какая вторая, верно? Итак, вы, кажется, в настоящее время используете sqlite и Qt 4, поэтому вам нужно будет получить драйвер sqlite Qt 4 для этого.

Вы можете самостоятельно проверить драйверы базы данных Qt SQL здесь:

Драйверы базы данных SQL

В зависимости от того, какую версию sqlite вы используете, у вас есть два варианта:

QSQLITE2 SQLite версии 2

QSQLITE SQLite версии 3

По сути, вот как вы сами создадите драйвер, если вам нужно это сделать:

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 без каких-либо хлопот, если вы не возитесь с путями вручную, чего вам не следует делать.

4) При этом это полностью общий подход, поэтому он будет работать для любого типа SQL, если вы замените sqlite тем, который вам нужен.

person lpapp    schedule 19.07.2014
comment
Это заслуживает того, чтобы быть в категории «Поддерживающий ответ». Спасибо за объяснение. Это нужно оценить. - person user3855415; 19.07.2014
comment
@ user3855415 Обычный способ оценить ответ на SO — это проголосовать за него. - person hyde; 19.07.2014
comment
@hyde: я думаю, у него недостаточно репутации для этого. Ему нужно как минимум 15. - person lpapp; 19.07.2014

Вы также должны поместить qsqlite4.dll в каталог с именем sqldrivers рядом с версией исполняемого файла вашего приложения.

person Nejat    schedule 19.07.2014
comment
Очевидно, еще один обман: stackoverflow.com/questions/6326274/ - person lpapp; 19.07.2014
comment
Это заслуживает того, чтобы быть ответом, потому что он первым указал на проблему. - person user3855415; 19.07.2014