Tuesday 6 December 2011

Compilar wxWidgets 2.9.2 en Windows 7 x64 con Cygwin y x86_64-w64-mingw32

Bueno por fin he podido compilar wxWidgets 2.9.2 con Cygwin/x86_64-w64-mingw32 en Windows 7 x64

Con el siguiente comando pude compilarlo:


../configure CFLAGS=-m64 CPPFLAGS=-m64 LDFLAGS=-m64 --host=x86_64-w64-mingw32 --build=x86_64-pc-cygwin --with-msw --disable-debug --enable-unicode --disable-universal --disable-monolithic --enable-gui --disable-shared --enable-exceptions --without-odbc --without-opengl --enable-xrc --enable-html --with-regex=builtin --enable-richtext --disable-mediactrl --disable-aui --enable-ribbon --enable-propgrid --enable-stc --enable-std_string --enable-std_iostreams --enable-stl --silent --enable-stc CXX=x86_64-w64-mingw32-g++.exe CC=x86_64-w64-mingw32-gcc.exe LD=x86_64-w64-mingw32-g++.exe


Como pueden ver, hay que pasar el argumento -m64 para que lo compile para la plataforma x64 y por supuesto ya los demas argumentos son cuestion de necesidad


Publicado en tttony.blogspot.com

Monday 5 December 2011

Solucion al: Error de la aplicacion 0xc000007b

OJO!
esto NO es una solucion para el pantallazo azul con ese mismo codigo, AQUI puedes encontrar la "posible" solucion pero esta en ingles

Mensaje de error al ejecutar el programa
Si haz compilado un programa con wxWidgets (solo la version 2.9.x soportan 64bits) para la arquitectura de 64bit usando el compilador de Visual Studio pero compilando dicho programa desde otra IDE como por ejemplo: DialogBlocks, wxDev-C++, etc... en mi caso he usado en este ejemplo el DialogBlocks 4.40

No hay mensaje de error en la compilacion ni del vinculador (link.exe), la compilacion es perfecta pero cuando ejecutas el programa te aparece el dichoso error 0xc000007b

Buscando y buscando en internet di con la solucion, el error es culpa del archivo¿? COMCTL32.DLL o mas bien culpa del Windows(si vamos mas atras es culpa de Microsoft) que no carga la version 64bits de dicho DLL, como lo muestra esta imagen de la dependencias del programa compilado en 64bits usando el programa Dependency Walker


Dependency Walker te dice que archivos son cargados por los programas

Como pueden ver en la imagen el archivo COMCTL32.DLL que se carga es la version x86/32bits y y los demas archivos dependendientes son de 64bits

En Visual Studio se encarga de incrustar el archivo manifest que es, el que se encarga de "decirle" al ejecutable de 64bits que cargue el archivo COMCTL32.DLL en su version de 64bits

Pero como dije anteriormente si usas un IDE que no es Visual Studio pero usas su compilador (cl.exe, link.exe, nmake.exe), hasta los momentos no he podido incrustar el archivo manifest ya sea pasando un parametro al vinculador (link.exe) o usando el Makefile.vc (en el link muestran como hacerlo con un makefile pero no me ha dado resultado :(

Por los momentos se puede hacer usando un archivo .bat que llame al archivo mt.exe, como indican aqui

Si no está realizando una generación incremental (/INCREMENTAL:NO), puede incrustar directamente el manifiesto utilizando una línea de comandos similar a la siguiente como paso posterior a la generación:

Para un ejecutable EXE:

mt.exe -manifest MyApp.exe.manifest -outputresource:MyApp.exe;1


Para una libreria dinamica DLL:

mt.exe -manifest MyLibrary.dll.manifest -outputresource:MyLibrary.dll;2


El ejecutable mt.exe esta en el directorio Bin\x64 de el Microsoft SDKs, este es el contenido del archivo manifest.bat que tengo en el directorio ejecutable:


"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64\mt.exe" -manifest wx64.exe.manifest -outputresource:wx64.exe;1


Y ya luego el programa se ejecuta como debe ser:




WX64.rar es el proyecto de ejemplo

La version wxWidgets que use fue la 2.9.2 compilado con la solucion wx_vc7.sln que esta en el directorio build\msw con unicode, estatico, release, 64bits, de todas maneras en el makefile veras las opciones y recuerda editar los directorios


Publicado en tttony.blogspot.com