Sunteți pe pagina 1din 9

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

Blog de Abelardo Jara Berrocal: Ubuntu, electronica y software libre Consejos para Ubuntu, electronica y software libre
Buscar en este Blog
Inicio Acerca de m Usando Fluxbuntu para herramientas Xilinx ISE 9.2 desde lnea de comandos ImageMagick: Capturador de pantallas y conversor de imgenes ligero para Fluxbuntu 16 mar

Compilacin cruzada: usando Ubuntu para compilar programas .exe para Windows
Posted marzo 16, 2008 by Abelardo Jara in Programacion C++ en Linux, Programacion C++ en Windows. 9 comentarios

Crditos
Autor: Hugo Ruscitti Fecha: 31 de Agosto del 2006

Introduccin
Este trabajo presenta una serie de consejos e indicaciones sobre como generar programas multimedia para Windows desde un sistema operativo como GNU/Linux. Dado que la temtica que trataremos es de cierta complejidad, he decidido no crear una referencia completa sobre las herramientas que utilizaremos, en su lugar intentar abordar el asunto de manera prctica, creando ejemplos de aplicaciones funcionales. De esta forma podr conocer los componentes mas elementales del proceso y ver sus resultados inmediatos.

El por qu de la cuestin
GNU/Linux cuenta con una extensa galera de recursos para quienes disfrutamos de la programacin. Entre aplicaciones y bibliotecas, GNU/Linux ofrece un entorno confortable y flexible, incluso, para desarrolladores de aplicaciones multimedia. Una herramienta para programadores muy interesante es Mingw (Minimalistic GNU for Windows), que naci con la intensin de adaptar varias herramientas de desarrollo del sistema GNU a entornos Windows. Si bien encontrar varios usos para Mingw, aqu lo utilizaremos para lograr que nuestro sistema GNU pueda generar archivos ejecutables para sistemas Windows. En general, a este proceso de exportar aplicaciones a otros sistemas o arquitecturas se lo denomina cross-building, cross-compile, o como decidimos llamarlo en este artculo: compilacin cruzada. Este recurso de soporte a otros sistemas nos permite ampliar nuestras posibilidades de crear programas Multiplataforma, sin cambiar de sistema y utilizando siempre Software Libre.

Requisitos
Para seguir este tutorial le recomiendo contar con algunas herramientas que veremos mas adelante: gcc, mingw y wine. Muchas distribuciones de GNU/Linux cuentan con sistemas administradores de paquetes que le permiten instalar y desinstalar programas con facilidad, por ese motivo no debera tener problemas en comenzar a probar los ejemplos de este artculo. El proceso de instalacin en mi sistema Debian GNU/Linux llev unos pocos segundos. Si utiliza este mismo sistema, u otro basado en l como Ubuntu o Knoppix, ejecute como usuario administrador (root) 1: apt-get install mingw32 El sistema de paquetes `apt` le informar que necesita instalar, como mnimo, otros 2 paquetes llamados `mingw32-

1 de 9

18/01/11 22:56

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

runtime` y `mingw32-binutils`. Indique S y contine. Si todo sale bien obtendr un mensaje como: Congurando mingw32-binutils (2.15.94-20050118.1-1) Congurando mingw32-runtime (3.7-1) Congurando mingw32 (3.4.2.20040916.1-2) En cambio, si se le presenta algn tipo de problema puede recurrir a las versiones en cdigo fuente disponibles en el sitio oficial de Mingw, o bien, obtener un entorno de compilacin completo en el sitio de la biblioteca SDL.

Nuestro programa ejecutable para GNU/Linux


Seguramente alguna vez ha escrito el clsico programa que imprime en pantalla la leyenda hola mundo !. Este sencillo programa nos resultar de mucha utilidad como primer ejemplo. Cdigo fuente: hola_mundo.c #include <stdio.h> int main (void) { printf (Hola mundo!\n); printf (\n); printf (pulse ENTER para continuar\n); getchar (); return 0; } Para crear un programa ejecutable compatible con GNU/Linux podemos invocar al compilador gcc de la siguiente manera: gcc hola_mundo.c Mediante dicho comando, se generar un archivo ejecutable llamado `a.out`. Ahora estamos en condiciones de ejecutar el programa escribiendo: ./a.out Tenga en cuenta que tambin podra alterar el nombre del programa generado (a.out) especificando el comando `-o` como se muestra a continuacin: gcc hola_mundo.c -o hola de forma que el archivo generado reciba el nombre `hola` en lugar de `a.out`.

Compilando para sistemas Windows con MinGW


El programa anterior funcionara solamente en GNU/Linux. Si nuestra intensin es generar una versin funcional para sistemas Windows podemos recurrir a MinGW. La forma de utilizar esta herramienta en GNU es muy similar al resto de los programas como gcc y make, en Mingw encontrar una serie de programas que cumplen las tareas de `procesar`, `compilar` y `enlazar` aplicaciones pero generando archivos ejecutables para sistemas Windows. En nuestro caso, el programa que reemplaza la tarea de generar el programa ejecutable ser i586-mingw32-gcc, por lo tanto si ejecutamos: i586-mingw32msvc-gcc hola_mundo.c -o hola.exe Obtendremos el archivo ejecutable hola.exe para sistemas Windows. Note que he utilizado la opcin `-o` como en el ejemplo de comando anterior para definir el nombre del programa. gcc no es nico programa incluido en Mingw, existen muchos otros bajo la misma nomenclatura, donde se utiliza el prefijo i586-mingw32msvc. Por ejemplo, para generar programas en lenguaje C++ puede utilizar el programa i586-mingw32msvc-g++.

Analizando el resultado de la compilacin


El programa que generamos con MinGW ya est en condiciones de funcionar en un sistema operativo como Windows, solo debera trasladar el programa ejecutable a ese sistema junto con su biblioteca mingwm10.dll. Aunque tambin existe la posibilidad de analizar el funcionamiento del programa desde nuestro propio sistema GNU/Linux, simulando un entorno de funcionamiento Windows. Existe un programa muy popular en GNU que nos permite interpretar aplicaciones para Windows, este programa se

2 de 9

18/01/11 22:56

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

llama Wine, y se incluye en numerosos repertorios de programas. En el caso de las distribuciones basadas en Debian GNU/Linux es probable que necesite instalarlo mediante el sistema `apt`. Para ello ejecute como administrador del sistema (root) el siguiente comando: apt-get install wine winesetuptk El segundo programa (winesetuptk) se utiliza para definir los parmetros de configuracin de wine de manera sencilla. Cuando termine de instalar el programa podr correr aplicaciones diseadas para sistemas Windows desde su sistema GNU invocando a los comandos: wine: para cargar y ejecutar programas grficos. wineconsole: para cargar y ejecutar programas de consola. Para verificar que nuestro programa `hola.exe` funciona mediante wine podemos ejecutar: wineconsole hola.exe Note que los programas para Windows suelen clasificarse en dos grupos: los programas de `consola` y las aplicaciones `grficas`. Aqu comenc con un programa sencillo para mostrar que puede compilarlo tanto para GNU como Windows, este primer ejemplo es un programa de `consola`. Analicemos otro ejemplo; en la documentacin del programa MinGW existe un programa que utiliza rutinas propias de los sistemas Windows. Lo utilizaremos para mostrar como funciona Wine con un programa grfico. Cdigo fuente: hello.c #include <windows.h> int main(int argc, char *argv[]) { MessageBox(NULL, Hello, world!, Hello, world!, MB_OK); return 0; } Si genera un archivo ejecutable en base a este programa grfico mediante Mingw32 , luego podr invocar al programa wine como se muestra a continuacin: wine hello.exe Obteniendo en pantalla: Si bien este no es un programa de `consola` debera tener en cuenta que en los sistemas Windows aparecer, de todas maneras, una pantalla de `consola`. Para evitar que esto ocurra debe indicarle a MinGW que el programa ser completamente `grfico` mediante la opcin `-mwindows`: -mwindows

Utilizando bibliotecas
MinGW tambin puede establecer vnculos entre nuestros programas y diversas bibliotecas dinmicas, simplemente debe obtener las bibliotecas de desarrollo que necesite, colocarlas en el directorio adecuado e indicarle a MinGW que las utilizar. Para mostrar esta posibilidad tomaremos como ejemplo un programa multimedia que utiliza la biblioteca SDL llamado Mouse. Primero instalaremos el entorno de desarrollo, luego generamos el programa y por ltimo analizaremos su funcionamiento mediante `wine`.

Instalando la biblioteca SDL


En el sitio web www.libsdl.org encontrar una versin de la biblioteca indicada como `mingw32`, al momento de escribir este artculo la versin mas reciente es 1.2.11 y el archivo para descargar recibe el nombre de sdl-devel1.2.11-mingw32.tar.gz. De todas formas es recomendable que visite la web de SDL y busque si existe una versin mas reciente. Para instalar esta biblioteca he tenido que ejecutar: tar xzvf sdl-devel-1.2.10-mingw32.tar.gz cd SDL-1.2.10 su mkdir /usr/local/cross-tools/ mkdir /usr/local/cross-tools/i386-mingw32msvc/ make cross make install

3 de 9

18/01/11 22:56

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

exit Si por algn motivo quiere alterar el directorio de instalacin de la biblioteca deber editar el archivo Makefile incluido en el directorio SDL-1.2.10 y reemplazar la linea: CROSS_PATH := /usr/local/cross-tools/i386-mingw32msvc/

Compilar un programa que utiliza SDL para GNU


Antes de continuar recordemos como utilizar la utilidad `sdl-config` para crear aplicaciones nativas en GNU/Linux: El proceso de compilacin de un programa que utiliza bibliotecas requiere de varias especificaciones (que bibliotecas enlazar, donde residen las cabeceras .h, etc). En GNU/Linux estas especificaciones se suelen indicar mediante programas (o scripts) que obtienen todos los parmetros necesarios para realizar la compilacin, en el caso de las bibliotecas SDL existe el comando sdl-config, que nos facilita la tarea de realizar especificaciones. Por ejemplo: sdl-cong cags nos informa todos los parmetros necesarios para iniciar el proceso de compilacin (generar los ficheros objeto). Adems: sdl-cong libs nos indica las opciones que debemos especificar para enlazar el programa a las bibliotecas. As, nuestro programa se puede compilar en GNU/Linux mediante el comando: gcc mouse `sdl-cong cags libs` Las comillas invertidas () le permiten a gcc obtener el retorno de sdl-config y utilizarlo como argumento. En este caso sera equivalente invocar a sdl-cong cags libs, copiar su resultado en pantalla y colocarlo como argumento al generar el programa con gcc. Una vez invocada la compilacin, nuestro programa de ejemplo se podr ejecutar mediante el comando: ./mouse Nuestro programa funcionando en GNU/Linux

Compilar un programa con SDL para Windows desde GNU


El proceso de compilacin mediante MinGW es muy similar, solo que debemos reemplazar la llamada a sdl-config por un script situado en: /usr/local/cross-tools/i386-mingw32msvc/bin/sdl-config Este script funciona de manera similar a la herramienta sdl-config nativa de GNU/Linux. Por ejemplo si queremos obtener todas las opciones de compilacin y enlace para nuestros programas con gcc invocamos a: /usr/local/cross-tools/i386-mingw32msvc/bin/sdl-config cags libs Para probar nuestro ejemplo completo, ejecutemos las siguientes sentencias en un intrprete de rdenes: alias gcc_cross=i586-mingw32msvc-gcc alias sdl-config_cross=/usr/local/cross-tools/i386-mingw32msvc/bin/sdl-config gcc_cross mouse.c -o mouse.exe `sdl-config_cross cags libs` Note que las llamadas a `alias` nos facilitan escribir los comandos completos. Para analizar otra alternativa de compilacin puede descargar el ejemplo completo e invocar al programa Make.

En caso de errores
Si el proceso de compilacin falla indicando que no se encuentran las cabeceras SDL.h, posiblemente se deba a un error del script `sdl-cong`. Note que las bibliotecas SDL se suelen instalar dentro de un directorio llamado include o include/SDL , el script `sdl-cong` debe indicar con precisin el lugar exacto en donde residen estos archivos. Lamentablemente he notado que la versin actual de sdl-config no indica correctamente la ruta de estos archivos .h en mi sistema. Si en su equipo ocurre lo mismo intente editar el archivo /usr/local/cross-tools/i386-mingw32msvc /bin/sdl-config como administrador de sistema (root) y cambie la linea: echo -I${prefix}/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main

4 de 9

18/01/11 22:56

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

por: echo -I${prefix}/include -D_GNU_SOURCE=1 -Dmain=SDL_main Si el problema persiste no dude en consultarlo en nuestro foro de mensajes. Otro problema muy frecuente en la utilizacin de esta biblioteca se encuentra en la inclusin del archivo SDL.h al cdigo de nuestro programa. La forma mas adecuada de incluir este archivo es mediante: #include SDL.h Es cierto que existen muchas formas de indicar la ruta a un archivo como este (SDL/SDL.h, sdl.H etc.), aunque sera deseable que adopte solo aquella forma que le brinda mayores posibilidades de generar el programa en diferentes sistemas sin cambiar una sola linea del programa.

Verificando el funcionamiento del programa:


A diferencia de nuestro primer ejemplo, este programa se encuentra vinculado a la biblioteca dinmica SDL y por ese motivo necesitar del archivo SDL.dll para que todo funcione correctamente. Tanto en sistemas Windows como mediante Wine podr resolver esta dependencia situando el archivo SDL.dll dentro del directorio donde reside el archivo ejecutable: cp /usr/local/cross-tools/i386-mingw32msvc/bin/SDL.dll ./ Ahora observemos como funciona nuestro programa con Wine: wine mouse.exe Programa mouse sobre Wine en Debian GNU/Linux si ejecutamos este mismo programa en un sistema Windows notaremos que su funcionalidad es idntica: Funcionando sobre Windows XP con el tema de escritorio clsico Si utiliza programas SDL con frecuencia, tal vez le resulte mas til situar el archivo SDL.dll dentro de la carpeta Windows\system (en el sistema Windows) o en $HOME/.wine/fake_windows/Windows/System (si utiliza Wine). Esto evitar que necesite copiar el archivo .dll en cada proyecto que realice.

Bibliotecas Adicionales
SDL cuenta con una serie de bibliotecas adicionales para brindar soporte a otras tareas como utilizar ficheros SVG (formato de imgenes vectoriales), MP3 (msica), GUI (interfases visuales), etc. Aadir estas bibliotecas a su proyecto es muy sencillo, solo debe obtener las bibliotecas de desarrollo que necesite para sistemas Windows (o aquellas indicadas para mingw32 ) y ubicar los archivos .h dentro del directorio: /usr/local/cross-tools/i386-mingw32msvc/include/ Luego necesitar copiar los archivos de biblioteca (.a/.la) en: /usr/local/cross-tools/i386-mingw32msvc/lib/ Por ltimo, no olvide que los usuarios de sus aplicaciones necesitarn tener los archivos .dll en su sistema a la hora de ejecutar los programas.

Conclusin
GNU/Linux incluye una extensa coleccin de programas interesantes para todo tipo de usuarios. A mi entender, Mingw es una herramienta indispensable para aquellos programadores que estudiamos el desarrollo de programas libres y Multiplataforma. Aqu solo hemos visto el principio de la historia

Licencia
Se permite la copia, modificacin y distribucin de este artculo slo bajo los trminos de la Licencia Creative Commons. Los programas de ejemplo se distribuyen bajo la licencia GPL.

Notas
1 En distribuciones como Ubuntu puede ejecutar `sudo apt-get ` como usuario normal. Ads by Google

5 de 9

18/01/11 22:56

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

Eficiencia De Negocios
Descubra Las Herramientas Que IBM Tiene Para Rentabilizar Su Empresa ibm.com

Like

Be the first to like this post.

9 respuestas a esta entrada.


1. Publicado por jeison en septiembre 25, 2008 at 2:57 pm buscando horas por internet porfn una pagina donde realmente encuentro lo que buscaba. En la universidad me piden que compile para windows y yo solo uso gnu/linux. probar a ver como funciona. hombre muchas gracias. Responder 2. Publicado por Oscar en noviembre 25, 2008 at 11:09 am muchisimas gracias por este post, la verdad me salvo de usar inevitablemente guingos. Desgraciadamente los servivcios educativos virtuales en mi pais estan completamente dominados por microsoft, pero con esto podre mantenerme libre por mas tiempo. gracias. Responder 3. Publicado por Oscar en noviembre 26, 2008 at 11:11 pm gracias ya hice gran cantidad de pruebas con programas de consola todo exelente pero bueno disculpa, soy muy nuevo en esto de linux y en esto de la programacion. Pregunto: como uso las librerias graficas de windows (windows.h) para compilar desde linux. intente descargar la libreria windows.h sin la mas minima esperanza de solucionar mi problema, la meti en mi directorio de librerias y le di compilar al programilla ejemplo que dejaste pues me pidio un mundo de librerias adicionales y no pude hacer nada. entonces concretamente como haria el programilla ejemplo de la ventana hola mundo. Responder 4. Publicado por Oscar en noviembre 27, 2008 at 11:11 pm muchas gracias ya hice lo de las aplicaciones graficas y consegui un paquete similar al mingw para fortran, te agradesco mucho tu ayuda muy atento de tu parte. Responder 5. Publicado por In0t_ en diciembre 9, 2008 at 7:17 am Me seria d innita ayuda saber usar MinGW para crear librerias (dlls) en lugar de ejecutables. Si me contestas al mail mjor que x aki. Gracias. Responder 6. Publicado por David Pealva en mayo 20, 2009 at 7:36 pm Un saludo a Hugo. no espere encontran tan grandioso comentario, eso me motiva a generar la libertad de poder respirar a mi gusto la programacin y el usos de sistemas libre; ya que en mi pais tambin vivimos oprimidos por M$ windos

6 de 9

18/01/11 22:56

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

bye Responder 7. Publicado por welman en junio 29, 2009 at 3:27 pm Hola! No soy experto en programacin, y lo que necesito es compilar un programa escrito en fortrar90 a .exe para ejecutarlo en windows vista. Te dejo mi correo para que me puedas escribir y enviarte el proyecto en fortran y me ayudes por favor. wcrosa@fgr.gob.sv o welman_16@hotmail.com Responder 8. Publicado por Wosquex en noviembre 7, 2009 at 4:46 am Excelente post maestro!!! Saludos y adelante con ms posts como este!!! Responder 9. Publicado por Francisco en marzo 16, 2010 at 2:57 pm Muchas gracias. Responder

Deja un comentario
Tu direccin de correo electrnico no ser publicada. Los campos necesarios estn marcados * Nombre * Correo electrnico * Web

Comentario Puedes usar las siguientes etiquetas y atributos HTML:


<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Publicar comentario
Recibir siguientes comentarios por correo. Recibir nuevas entradas por email.

Pginas
Acerca de m

Administracion
Registrarse Acceder RSS de las entradas

7 de 9

18/01/11 22:56

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

RSS de los comentarios WordPress.com

Elegir categora
Entradas recientes
Como enviar correos electronicos desde la linea de comando con sendemail en Ubuntu Encuesta: Habilitar chat de Facebook (XMPP) en Empathy (Ubuntu) Colocar un fondo de escritorio animado en Ubuntu Karmic y Lucid con Xwinwrap Mi primer video de Ubuntu usando OpenShot Que son las variables volatile y para que sirven? Mantener una coleccion ordenada de articulos tecnicos: usando Mendeley en Ubuntu Tutorial: Congurar EMACS como editor completo para C/C++, Python y VHDL (incluye conguracion del navegador con w3m, blogging con weblogger y correo con wanderlust) Instalar Google Earth 5 en Ubuntu e integrarlo con tu tema GTK preferido Simulador Modelsim 6.2 SE NATIVO para Ubuntu Linux 32 y 64 Instalar fuentes de Office 2007 en Ubuntu Tema de KDE 4 para Gnome Como empezar a programar microcontroladores PIC en Ubuntu Hardy Instalar MARS: ensamblador y simulador del procesador MIPS para cursos de Arquitectura de Computadoras en Ubuntu Usando el compilador de Microsoft Visual C++ 2005/2008 en Ubuntu Linux Extraer el contenido de un archivo RPM sin instalar en Ubuntu Instalar LabView 8.5 en Ubuntu Hardy y posteriores Uso de los paquetes .diff.gz para compilar aplicaciones en Linux/Ubuntu Optimizar el uso de bateria en Ubuntu Windows 7 vs Windows Vista vs Ubuntu Cambiar el nombre de cuenta de usuario en Ubuntu: Una forma sencilla Compilador online de codigo

Entradas mensuales

Elegir mes
Posts Ms Vistos
Cambiar el nombre de cuenta de usuario en Ubuntu: Una forma sencilla Generar archivo distribuible JAR en Netbeans Unir varios PDFs en Ubuntu Como usar SCP, el complemento de SSH para transmitir archivos y carpetas Un plugin muy rapido para descargar videos del YouTube Reparar memoria USB con Ubuntu Instalar LabView 8.5 en Ubuntu Hardy y posteriores Como crear servidor de repositorios Ubuntu/Debian para nuestra red local Habilitar chat de Facebook (XMPP) en Empathy (Ubuntu) Instalar Matlab 7 R14 en Fluxbuntu/Ubuntu Gutsy - Actualizacion a Matlab 2008b para Linux Tutorial: Configurar EMACS como editor completo para C/C++, Python y VHDL (incluye configuracion del navegador con 'w3m', blogging con 'weblogger' y correo con 'wanderlust') Expresiones Regulares en la shell: Ejemplos de uso con grep, awk y sed.

Comentarios recientes
antonio on Los estados de un proceso en U relajaoo on Codicar con script de bash t calomx on Mantener una coleccion ordenad Luciano on Como enviar correos electronic calomx on Mantener una coleccion ordenad

Blog Stats
8 de 9 18/01/11 22:56

Compilacin cruzada: usando Ubuntu para compilar programas .exe para...

http://pintucoperu.wordpress.com/2008/03/16/compilacion-cruzada-usand...

555,534 ubunteros y ubunteras

marzo 2008 L M X J V S D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 feb may Blog de WordPress.com. Theme: Spring Loaded by the449.

9 de 9

18/01/11 22:56

S-ar putea să vă placă și