Implementación de la aplicación Qt 5 en Windows
Escribí un par de aplicaciones en QML (parte de Qt 5). En una pregunta que hice antes ( https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x ), encontré la solución para implementar mi aplicación en OS X (usando la herramienta macdeployqt).
Implementar aplicaciones Qt4 en Windows fue fácil:
- Lo compilaste en modo de lanzamiento.
- Copiaste las bibliotecas necesarias (DLL).
- Lo probaste y funcionó.
Desafortunadamente, este enfoque no funcionó en Qt5 (incluso incluí la carpeta de plataformas con el archivo qwindows.dll y no funcionó). Después de algunos días de intentarlo, me di por vencido y compilé una versión estática de Qt5.
De nuevo, no funcionó. La aplicación funciona en una PC con Qt instalado, pero falla en PC "limpias". Como nota al margen, los sistemas Windows 8/8.1 no muestran una advertencia ni un mensaje notificándome sobre el bloqueo de la aplicación. Pero en Windows 7 un mensaje me notifica que la aplicación falló.
Intenté ejecutar Dependency Walker (depends.exe) y todas las bibliotecas en la compilación estática de mi aplicación parecían estar bien.
En Windows 8 no me sale ningún error. Pero después de crear un perfil de la aplicación en depend.exe, aparece una infracción de acceso que se origina en QtGui.dll. El error exacto es
Se produjo la excepción de segunda oportunidad 0xC0000005 (infracción de acceso) en "QT5GUI.DLL" en la dirección 0x61C2C000.
¿Hay algo que me falta (por ejemplo, un archivo DLL o de configuración adicional)?
Información de la aplicación:
- Escrito y compilado con Qt 5.2.1
- Utiliza Rápido/QML.
- Utiliza el módulo de red.
- Utiliza el módulo webkit.
- Utiliza el módulo bluetooth.
- Los archivos QML están escritos en Quick 2.2
A partir de Qt 5.2, existe windeployqt
una herramienta que puede utilizar. Simplemente ejecútelo desde la línea de comando para obtener ayuda. Pero el uso básico es darle el archivo .exe, copiará las dependencias de Qt junto con él.
Querrá utilizar --qmldir
la opción para que la herramienta sepa dónde están sus archivos QML, para que pueda determinar las dependencias QML necesarias.
Nota sobre las pruebas: para asegurarse de tener todo, pruebe en una computadora sin Qt SDK o cambie temporalmente el nombre del directorio Qt. De lo contrario, la aplicación podría encontrar archivos faltantes desde allí...
Después de algunas horas investigando en los foros de Qt, descubrí que necesito copiar la carpeta "qml" (normalmente ubicada en C:/Qt/5.2.1/qml) al directorio raíz de la aplicación. Después de hacerlo, tanto la versión dinámica como la estática de mi aplicación funcionaron en sistemas básicos.
Directorio de programas (MinGW 4.8 32 bits, dinámico):
Como dijo Hyde , use la windeployqt
herramienta ( <qt path>\<version>\bin\windeployqt.exe
) para copiar los archivos necesarios a la carpeta de su aplicación. Después de eso, copie los componentes QML requeridos <qt path>\<version>\qml\
a la carpeta de su aplicación. La carpeta resultante debería verse similar a:
- plataformas (carpeta)
- QtQuick (carpeta)
- QtQuick.2 (carpeta)
- Cualquier otro componente QML que necesite
- aplicación.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
Directorio de programas (estático)
Compile la aplicación estáticamente y luego copie los componentes QML necesarios <qt path>\<version>\qml\
en la carpeta de su aplicación. La carpeta resultante debería verse similar a:
- QtQuick (carpeta)
- QtQuick.2 (carpeta)
- Cualquier otro componente QML que necesite
- aplicación.exe
Creo que la causa del bloqueo fue que Qt5Gui.dll
(dinámico y estático) "intentó" cargar las carpetas QtQuick* durante el tiempo de ejecución, pero no pudo encontrarlas (por lo que la aplicación se bloqueó durante la carga).