Развертывание приложения 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 было простым:
- Вы скомпилировали его в режиме релиза.
- Вы скопировали необходимые библиотеки (DLL).
- Вы проверили, и это сработало.
К сожалению, этот подход не работал в 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. В противном случае приложение может найти отсутствующие файлы оттуда...