Compilar QT para Windows CE (y Windows Mobile) con Visual C++

Bueno, siguiendo con la tónica de las compilaciones de QT, ahora le toca el turno a la versión para Windows CE. Aquí la apuesta sube, porque no es todo tan automatizado como las compilaciones más estándar, aunque lo cierto es que no es tan complicado y tan sólo hay que llevar algo de cuidado al hacerlo.

En primer lugar necesitamos una versión de Visual C++ compatible con dispositivos embebidos. En mi caso será Visual Studio 2008SP1 Team System, pero también valen versiones inferiores o anteriores, aunque no posteriores porque, de momento, Visual Studsio 2010 no soporta desarrollos para Windows CE ni ningún otro Windows Mobile.

Una vez que tengamos dicha versión, tenemos que instalar correspondiente SDK de Windows Mobile. En el caso que nos ocupa, será un SDK de Windows CE 5.0 que yo mismo he generado y que ya he publicado en entradas anteriores.

La instalación ha de ser cuidadosa, sobre todo en Windows Vista y 7, ya que los instaladores de Windows Mobile 5 e inferiores fallan silenciosamente y, aunque parece que el SDK está instalado, falta algo y luego no funcionará bien.

Para hacerlo bien, seguimos los siguientes pasos:

  1. Desactivamos UAC.
  2. Reiniciamos el ordenador.
  3. Instalamos el SDK
  4. Volvemos a reiniciar.
  5. Ejecutamos la versión correspondiente de Visual Studio.
  6. Cerramos Visual Studio.
  7. Activamos UAC.
  8. Reiniciamos.

Seguid el proceso exactamente como está descrito y todo funcionará perfectamente bien.

***

Ahora le toca a QT. Vamos a la web de Nokia y nos bajamos la versión Open Source correspondiente a Windows CE, que no es otra cosa que el SDK normal y corriente pero sólo con el código fuente. Generalmente es un ZIP, que debemos descomprimir sobre alguna carpeta sin espacios en blanco. Yo lo tengo en C:QTce-4.6.3, y de ahí cuelgan las carpetas del SDK (bin, src, etc).

En el caso de que vayáis a usar mi SDK, u otro generado con el Platform Builder 5, hay que realizar una serie de pasos extra. Si vais a usar un SDK oficial de Microsoft, nos podemos saltar los pasos siguientes.

Nos vamos a la carpeta C:QTce-4.6.3mkspecs, y ahí veremos una serie de carpetas que se corresponden con cada compilación posible. Veremos una espuerta de Linuxes y Unixes, y también una serie de carpetas que tienen una pauta como “wince50<nombre>-<procesador>-msvc<Versión>”.

Si os fijáis, hay soporte automático para Windows CE 5, Windows CE 6, Windows Mobile 5 (Pocket y Smart), Windows Mobile 6 y 6.5 en todas sus variantes. Y encima para Visual C++ 2005 y 2008. Pues bien, de esas carpetas es de dónde sacan las herramientas de QT la información para compilar. Y como podréis comprobar, no hay ninguna con el nombre de mi SDK o de cualquier otro.

Tenemos que crear una de ellas con nuestra configuración. Mientras no hayamos creado un SDK que se aparte mucho del estándar, los cambios son sencillos.

Lo primero es copiar la carpeta que más se acerque a nuestro SDK. En mi caso ha sido “wince50standard-armv4i-msvc2008”. Yo la he renombrado a “wince50custom-armv4i-msvc2008”. Entramos en ella y abrimos el fichero “qmake.conf”. Vemos que simplemente incluye al “qmake.conf” de la misma configuración de Visual C++ 2005 y cambia la versión del compilador.

Nosotros, para evitarnos rollos, hemos creado uno desde cero juntando ambos, y grabándolo en nuestra carpeta. El contenido para mi SDK es el siguiente:

#
# qmake configuration for wince50standard-armv4i-msvc2005
#
# Written for Microsoft VC2005.NET with Standard SDK for WindowsCE 5.0 (ARMV4I)
#

include(../common/wince/qmake.conf)

CE_SDK = WindowsCE5Emulator

CE_ARCH = ARMV4I

DEFINES += STANDARDSHELL_UI_MODEL _WIN32_WCE=0x500 $$CE_ARCH _ARMV4I_ armv4i _ARM_ ARM _M_ARM ARM __arm__ Q_OS_WINCE_STD QT_NO_PRINTER QT_NO_PRINTDIALOG

QMAKE_CFLAGS += -QRarch4T -QRinterwork-return

QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:WINDOWSCE,5.00 /MACHINE:THUMB /ENTRY:mainACRTStartup

QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWSCE,5.00 /MACHINE:THUMB

QMAKE_LFLAGS_DLL = /SUBSYSTEM:WINDOWSCE,5.00 /MACHINE:THUMB /DLL

QMAKE_LIBFLAGS = $$QMAKE_LFLAGS_WINDOWS

QMAKE_LIBFLAGS_RELEASE = /LTCG

QMAKE_LIBS = corelibc.lib

QMAKE_LIBS_CORE = corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib

QMAKE_LIBS_GUI = ceshell.lib ole32.lib $$QMAKE_LIBS_CORE

QMAKE_LIBS_NETWORK = ws2.lib

QMAKE_COMPILER_DEFINES -= _MSC_VER=1400

QMAKE_COMPILER_DEFINES += _MSC_VER=1500

Tan sólo hemos cambiado el nombre del SDK original por el mío:

CE_SDK = WindowsCE5Emulator

Quizás os preguntéis por qué crear un nuevo SDK si ya existe uno: el “Standard SDK for CE 5.0”. Es muy sencillo: el emulador que viene con dicho SDK no es compatible con Visual C++ 2005/8. Además, es un emulador x86 en lugar de ARM.

***

Bueno, ya hemos definido los specs de nuestro SDK. Ahora toca ejecutar el “configure.exe” correspondiente.

Abrimos una consola de comandos de Visual Studio o del Windows SDK (de Windows normal, no de CE) que tengamos instalado. Una vez abierto nos vamos a C:QTce-4.6.2 y desde allí ejecutamos

setenv /Release /x86 /xp

De este modo activamos la configuración para Release, x86, y XP que es lo más común a todas las opciones (aunque de hecho no nos haga falta).

Añadimos el PATH a lo que será la carpeta en donde irán los ejecutables de plataforma cruzada cuando se compilen:

set path=C:QT-4.6.3bin;%path%

Que no se os olvide añadir el PATH anterior porque si no nos quedaremos con una consola poco menos que inútil.

Vale. Ahora le toca al configure:

configure -platform win32-msvc2008 -xplatform wince50custom-armv4i-msvc2008 -debug-and-release -shared -no-qt3support –opensource

Si habéis seguido mis otras entradas, aquí hemos añadido la opción xplaform para que compile con nuestros specs. Ahí es donde tenéis que colocar los adecuados a vuestro SDK, sea estándar o no. Por ejemplo, si fuéramos a compilar para Windows Mobile 6.5 profesional, deberíamos poner “wincewm65professional-msvc-2008”.

No debería haber ningún problema con la ejecución del comando, pero si la hubiera hay que revisar lo que hemos hecho o incluso probar con una plataforma existente o diferente a ver qué pasa.

***

Ahora viene un paso un tanto delicado si estamos con una plataforma personalizada, como es el caso. Si estamos usando un SDK estándar, con seguir las órdenes que nos ha dado el propio configure al terminar es suficiente, pero si no, debemos ignorarlas y hacerlo a mano.

Lo primero es averiguar los SDK disponibles, ejecutando el comando:

checksdk –list

La captura siguiente nos muestra los que el autor tiene disponibles:

image

La que nos interesa es la última de todas, que se corresponde a nuestro SDK. Ahora volvemos a ejecutar el comando pero con otros parámetros (respeta las mayúsculas y minúsculas):

checksdk -sdk "WindowsCE5Emulator (ARMV4I)" -script env.bat

De este modo creamos el fichero BAT con los comandos necesarios para habilitar las variables de entorno del SDK para que el compilador de plataforma cruzada sepa dónde y qué ficheros cabecera y bibliotecas enlazar.

Ya solo nos quedan dos pasos:

env.bat
nmake

Al final de ese proceso (varias horas en mi Q4 con 8GB de RAM), tendremos QT compilado y listo para funcionar en cualquier SDK.

Como atajo, os dejo el contenido de un fichero .BAT que automatiza los últimos pasos según la forma explicada en otras entradas:

cd %1
set path=C:QT%1bin;%path%
configure -platform win32-msvc2008 -xplatform wince50custom-armv4i-msvc2008 -debug-and-release -shared -no-qt3support –opensource
rem checksdk -sdk "WindowsCE5Emulator (ARMV4I)" -script env.bat
call env.bat
nmake
cd ..

Con este fichero, y la copia de la carpeta que hemos creado dentro de mkspecs podremos recompilar cualquier versión de QT para Windows CE/Mobile.

Y después de configurar las opciones adecuadas en las opciones del QT Addin para Visual Studio (que he explicado en otra entrada del blog), y tras varios petes de Visual Studio intentando lanzar el emulador y las DLL de QT (cosa que siempre me pasa las primeras veces que añado algo nuevo al IDE), aquí tenéis una captura de un programa de demo ejecutándose con el emulador configurado como si fuera un JE200:

image

7 comentarios en “Compilar QT para Windows CE (y Windows Mobile) con Visual C++”

  1. Hola estoy tratando deañadir la libreria de Qt win ce, hago todos los pasos que escribiste pero a la hora de darle en qt->options y añadir el path me sale el siguiente error “this qt version is not compatible to your current visual studio (qt builds version 0, current version 1400)” no se que pueda ser, o si estoy añadiendo el path mal, yo estoy añadiendo la carpeta que esta en Qt no se si estoy haciendo mal. le agradeceria si me colaborara.

    Grcias

  2. Hola

    He seguido todos tus pasos y todo sin ningun problema pero cuando me dirijo a visual studio ->qt->qt options he intento añadir la carpeta me sale el siguiente error ” this qt version is not compatible to your current visual studio (qt builds version 0, current version 1400)” y no se que pueda ser, estoy añadiendo la carpeta que esta dentro de Qt que en su caso seria C:QTce-4.6.2, te agradeceria me colaboraras.

    Gracias

  3. Hola.

    Pues no sé a qué se puede deber. Si lo has podido compilar con el propio compilador, debería reconocértelo. No tengo ni idea de por qué no lo hace…

  4. Hola

    me podrias explicar despues de hacer todo hasta el nmake, que hiciste en visual studio para agregar la libreria, de pronto ahi es donde estoy fallando, te lo agradeceria.

    Grcias

  5. Hola

    Queria saber en donde cambiaste la configuración del SDK desde aqui
    # qmake configuration for wince50standard-armv4i-msvc2005

    no entiendo en donde cambiaste todo eso si es en la consola o en donde?

    gracias

  6. Está bien claro en el texto.

    Con un editor de textos, en la carpeta C:QTce-4.6.3mkspecs abres el fichero indicado (que antes has de haber copiado a partir de la plantilla que más se acerque a tu configuración, y lo editas con lo que te de la gana.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *