Развертывание приложения 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. В противном случае приложение может найти отсутствующие файлы...