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

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

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

  1. Вы скомпилировали его в режиме релиза.
  2. Вы скопировали необходимые библиотеки (DLL).
  3. Вы проверили, и это сработало.

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

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

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

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

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

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

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

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

2 ответа

Решение

После нескольких часов копания в форумах Qt я обнаружил, что мне нужно скопировать папку "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
  • libstdC++ - 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* во время выполнения, но не смог найти их (таким образом, сбой приложения во время загрузки).

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

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

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

Другие вопросы по тегам