Развертывание приложения Qt 5 в Windows

Я написал несколько приложений в QML (часть Qt 5). В вопросе, который я сделал ранее (https://softwareengineering.stackexchange.com/info/213698/deploying-qt-based-app-on-mac-os-x), я нашел решение для развертывания моего приложения в OS X (используя инструмент macdeployqt).

Развертывание приложений Qt4 в Windows было легко:

  • Вы скомпилировали его в режиме выпуска.
  • Вы скопировали необходимые библиотеки (DLL).
  • Вы протестировали и сработали.

К сожалению, этот подход не работал в Qt5 (я даже включил папку платформ с файлом qwindows.dll, и это не сработало). После нескольких дней попыток я сдался и составил статическую версию Qt5.

Опять же, это не сработало. Приложение работает на ПК с установленной Qt, но он падает на "чистых" ПК. В качестве примечания, системы Windows 8/8.1 не дают предупреждения или сообщения, уведомляющего меня о сбое приложения. Но в Windows 7 сообщение уведомляет меня о том, что приложение потерпело крах.

Я попытался запустить Dependency Walker (depend.exe), и все библиотеки в статической сборке моего приложения выглядели прекрасно.

В Windows 8 я не получаю никаких ошибок. Но после профилирования приложения в файле зависит .exe, я получаю нарушение доступа, происходящее из QtGui.dll. Точная ошибка

Второе исключение вероятности 0xC0000005 (Нарушение доступа) произошло в "QT5GUI.DLL" по адресу 0x61C2C000.

Есть ли что-то, что мне не хватает (скажем, дополнительный DLL или файл конфигурации)?

Информация о приложении:

  • Написано и скомпилировано с Qt 5.2.1
  • Использует Quick/QML.
  • Использует сетевой модуль.
  • Использует модуль webkit.
  • Использует модуль bluetooth.
  • Файлы QML написаны в Quick 2.2

Ответы

Ответ 1

После нескольких часов работы в Qt Forums я узнал, что мне нужно скопировать папку "qml" (обычно находящуюся в C:/Qt/5.2.1/qml) в корневой каталог приложения. После этого динамические и статические версии моего приложения работали на ванильных системах.


Каталог программ (MinGW 4.8 32-разрядный, динамический):

Как hyde, используйте инструмент windeployqt (<qt path>\<version>\bin\windeployqt.exe), чтобы скопировать ненужные файлы в папку вашего приложения. После этого скопируйте необходимые компоненты QML из <qt path>\<version>\qml\ в папку приложения. Полученная папка должна выглядеть так:

  • платформы (папка)
  • QtQuick (папка)
  • QtQuick.2 (папка)
  • Любые другие компоненты QML, которые вам нужны
  • app.exe
  • icudt51.dll
  • icuin51.dll
  • icuuc51.dll
  • libgcc_s_dw2-1.dll
  • libstdС++ - 6.dll
  • libwindthread-1.dll
  • Qt5Core.dll
  • Qt5Gui.dll
  • Qt5Qml.dll
  • Qt5Quick.dll
  • Qt5Network.dll
  • Qt5Widgets.dll

Каталог программ (статический)

Скомпилируйте приложение статически, затем скопируйте необходимые компоненты QML из <qt path>\<version>\qml\ в папку приложения. Полученная папка должна выглядеть так:

  • QtQuick (папка)
  • QtQuick.2 (папка)
  • Любые другие компоненты QML, которые вам нужны
  • app.exe

Я думаю, что причиной сбоя было то, что Qt5Gui.dll(динамический и статический) "пытался" загружать папки QtQuick * во время выполнения, но не смог их найти (таким образом, сбой приложения во время загрузки).

Ответ 2

Начиная с Qt 5.2 существует инструмент windeployqt, который вы можете использовать. Просто запустите его из командной строки, чтобы получить справку. Но основное использование - дать ему файл .exe, он скопирует зависимости Qt, чтобы пойти с ним.

Вы хотите использовать опцию --qmldir, чтобы инструмент знал, где находятся ваши файлы QML, поэтому он может найти необходимые зависимости QML.

Примечание о тестировании: убедитесь, что у вас есть все, протестируйте компьютер без Qt SDK или временно переименуйте каталог Qt. В противном случае приложение может найти отсутствующие файлы...