Javier Valcarce's Personal Website

GCC para Windows

From JavierValcarce.Es

You are at: Home > Software > GCC para Windows
Jump to: navigation, search
Resumen
Este articulo explica como instalar y configurar las herramientas de desarrollo de GNU (autotools, make, gcc, gdb, etc) en Windows. El entorno de desarrollo obtenido es muy similar al de UNIX[1].


Dos versiones distintas ¿cuál elegir?

Existen dos versiones distintas de estas herramientas para Windows

Lo primero que debes saber es que con las dos versiones se puede hacer casi lo mismo y elegir una u otra es casi siempre una cuestión de preferencia personal aunque hay ciertas ocasiones especiales en las que necesitarás Cygwin. Es posible también instalar las dos versiones en un mismo ordenador aunque no es recomendable.

Si no sabes cuál instalar pregúntate ¿qué tipo de programas quiero compilar?

  • Aplicaciones de 32/64 bits para Windows. Tanto la una como la otra sirven perfectamente
  • Aplicaciones de UNIX sin tener que cambiar (demasiado) el código fuente. Entonces necesitas Cygwin obligatoriamente.
  • Kernels de sistema operativo. En teoría sirven las dos, pero en la práctica tendrás que usar Cygwin porque, al menos de momento, MinGW tiene una serie de fallos (bugs) que lo incapacitan para compilar un kernel. En concreto la versión 3.4 de MinGW falla en varias cosas


Conclusión: En la mayor parte de los casos MinGW+MSYS es la preferida porque es la más fácil de instalar y configurar. Mi recomendación sin embargo es que instales Cygwin, es un poco más compleja y difícil de configurar pero mucho más versátil, con ella puedes hacer lo mismo que con MinGW y muchas más cosas.

Emulación de UNIX en Windows

Para entender qué es Cygwin y MSYS primero debes entender lo que es una DLL de emulación.

Es posible traducir las llamadas al sistema operativo A a las de otro sistema operativo B siempre y cuando B provea una funcionalidad similar a la de A. La idea es escribir una biblioteca dinámica (DLL) que implemente todas las llamadas al sistema de UNIX y que las traduzca en llamadas al sistema de Windows, de esa forma sería posible recompilar el código fuente de un programa UNIX, enlazarlo con la DLL y ejecutarlo en Windows.

Esta DLL de traducción implementa las llamadas al sistema clásicas de UNIX como fork(), open(), etc y las traduce en las llamadas al sistema equivalentes de Windows. Es, por tanto, una capa de emulación de UNIX en Windows.

Esta DLL no es un emulador de UNIX para Windows (no es el equivalente a Wine para Windows), i.e., no permite ejecutar programas binarios de UNIX en Windows. Los programas hay que recompilarlos y enlazarlos con la DLL, además, es posible que el código fuente deba ser mínimamente cambiado.

Los entornos Cygwin o MSYS son distribuciones de software (colecciones de programas) para Windows que consisten en 2 partes:

  • Una DLL que traduce las llamadas de UNIX en las equivalentes de Windows. Cygwin usa cygwin1.dll (1230 KB) mientras que MSYS usa msys-1.0.dll (771 KB)
  • Y un conjunto de programas de UNIX (ls, cp, mv, bash, ssh, etc) recompilados para Windows sin necesidad de cambiar el código fuente porque se enlazan con esta DLL, de la cual dependen. Puedes ver las dependencias de un ejecutable cualquiera con la utilidad Dependency Walker (es el equivalente al ldd de UNIX)

¿Qué diferencia hay entre Cygwin y MinGW+MSYS?

MSYS surgió como una escisión (fork) del proyecto Cygwin, que es mucho más grande y complejo. Podriamos decir que MSYS (Minimal System) es el hermano pequeño de Cygwin, ha sido adaptado y simplificado para proveer un entorno mínimo en el que configurar/compilar paquetes de software para Windows con las órdenes típicas configure, make, make install que se usan en UNIX.

La DLL de MSYS es más pequeña y simple que la de Cygwin y el conjunto de programas UNIX recompilados que trae consigo es también mucho más reducido: unos 80 programas (ls, cp, mv, grep, gzip, tar, diff, cvs, ssh, scp, etc) frente a los varios cientos de MB de software recompilado que trae Cygwin.

  • MinGW+MSYS tiene como objetivo proporcionar simplemente las herramientas de programación de GNU para Windows y una shell en la que poder ejecutar configure, make, make install
  • Cygwin, por otra parte, es un proyecto mucho más ambicioso: además de lo anterior, proporciona cientos de MB de software incluyendo compiladores y programas de uso general (existe incluso un servidor X para Windows) y una capa de emulación POSIX para portar programas de UNIX a Windows.

Instalar MinGW+MSYS

MinGW y MSYS son 2 programas independientes aunque pensados para trabajar juntos, el único realmente indispensable es MinGW, MSYS es opcional aunque muy recomendable (aunque sólo sea para sustituir el cutre "Símbolo de sistema" de Windows)

  • MinGW. Es la versión de GCC para Windows, incluye los programas as, ld, gcc, etc. Su código fuente ha sido adaptado y recompilado para Windows (no usan ningún tipo de DLL de emulación, son 100% Windows)
  • MSYS. Un terminal llamado rvxt (C:\MSYS\1.0\BIN\RXVT.EXE), el shell bash de UNIX y un conjunto de utilidades básicas como cp, mv, touch, etc. que funcionan en Windows gracias a la DLL de emulación msys-1.0.dll

Paso 1 Instalación del software

En la página de descargas de MinGW verás que aparecen múltiples ficheros clasificados en las secciones "Candidate", "Current", "Previus", etc.

La distribución de GCC para Windows está dividida en múltiples ficheros que hay que seleccionar y descomprimir uno a uno. Esto permite seleccionar exactamente lo que quieres instalar pero hace que la instalación sea complicado. Afortunadamente existe un instalador automático llamado MinGW-5.X.exe que instala a todo en un par de clicks.

En la sección "Current" (también en "View older releases from the Current package") instala lo siguiente en este orden

  1. Instala MinGW-X.Y.exe en C:\MINGW
  2. Instala MSYS-X.Y.exe en C:\MSYS
  3. Instala MSYSDTK-X.Y.exe en C:\MSYS

Paso 2 Ajuste de las variables de entorno

Las variables de entorno están en Panel de Control->Sistema->Avanzado->Variables de entorno

  1. Crea un directorio personal (HOME) y añade la variable HOME = C:\TU_DIRECTORIO_PERSONAL, te recomiendo que no haya espacios en el nombre
  2. Es conveniente que añadas el directorio C:\MINGW\BIN y C:\MSYS\1.0\BIN en el PATH para poder llamar al compilador y a los programas que vienen con MSYS desde cualquier directorio en el que te encuentres


Paso 3 Comprobación de que todo funciona bien

Escribe lo siguiente en el fichero hello.c

#include <stdio.h>

int main(int argc, char **argv)
{
  printf ("Hello\n");
  return (0);
}

Ahora puedes usar dos terminales distintos:

  • "Símbolo del sistema" (cmd.exe) de Windows de toda la vida
  • Menú Inicio->Programas->MSYS->msys (rxvt.exe) junto con el intérprete bash.exe para Windows. Puedes ajustar los ficheros ~/.profile y ~/.bashrc exactamente igual que en UNIX, el directorio ~ se refiere a tu directorio HOME (echo $HOME) que definiste más arriba.

Tanto en uno como en el otro, si tienes C:\MSYS\1.0\BIN en el PATH podrás usar los programas ls, mv, cp, ssh... (son unos 80) como si estuvieses en UNIX

Compila y ejecuta el programa desde la línea de órdenes:

# gcc -o hello hello.c
# ./hello
# Hello
#

Paso 4 Por último es interesante leer la documentación y la lista de preguntas frecuentes de MinGW, que cuenta entre otras cosas cómo crear DLLs o llamar a DLLs compiladas con MSVC (Microsoft Visual C Compiler) desde programas compilados con MinGW y viceversa.

Instalar Cygwin

El programa de instalación de Cygwin además de para instalar sirve para actualizar los paquetes instalados. Es una herramienta de instalación de paquetes como las que hay en cualquier distribución de Linux. Conviene ejecutarlo de vez en cuando y comprobar si hay versiones nuevas de cada uno de los paquetes.

Paso 1 Descarga el programa de instalación de la página de Cygwin y ejecútalo.

Paso 2 Directorio de instalación y de descarga de paquetes

El directorio de instalación no debe contener espacios, C:\CYGWIN es una elección excelente. El directorio para almacenar los paquetes descargados puede ser por ejemplo C:\CYGWINPKG

Paso 3 Elige un servidor réplica para descargar los paquetes

Paso 4 Selección de paquetes

Ahora te presenta la lista de paquetes disponibles para descargar e instalar. ¡No se te ocurra seleccionarlos todos! Hay muchísimos y necesitarias varios GB de espacio libre en disco, tú no necesitas tantos y, además, algunos paquetes son incompatibles unos con otros.

Algunos ya están preseleccionados, no los toques. Asegúrate de que seleccionas al menos rxvt, wget, file, bzip2, autoconf, automake, make y gdb (quizá también netcat, links) además de los diversos compiladores que te interesen (gcc, g++, gdc, gcj, etc). Si quieres usar emacs te recomiendo la versión nativa para Windows (elige la última versión "-bin"), no la de Cygwin.

Configuración básica

  1. Crea un directorio personal para ti (HOME), te recomiendo que el nombre no tenga espacios, por ejemplo C:\HOME es perfecto
  2. Define la variable HOME = C:\HOME (Panel de Control->Sistema->Avanzado->Variables de entorno). En bash, este directorio se representa simplemente como ~ (gusanito)
  3. Edita C:\CYGWIN\cygwin.bat y pon algo similar a esto:
    @echo off
    set PATH=C:\CYGWIN\BIN;%PATH%
    c:
    chdir %HOME%
    rxvt -e bash --login
    
    El fichero cygwin.bat anterior lanza el emulador de terminal RXVT (se supone que lo instalaste en el paso anterior), si quieres usar el clásico cmd.exe (el de windows) no cambies la última linea.
  4. Ahora puedes editar los típicos ficheros de configuración de bash ~/.bashrc, .alias, redefinir el PATH, el prompt, etc, igual que en UNIX.

Configuración de RXVT

Una sesión de bash puede ocurrir dentro del terminal cmd.exe (la clásica consola de Windows) o bien dentro de rxvt.exe, que es un emulador de terminal VT100 mucho más avanzado que puede usarse también para el trabajo diario (pero mira la nota más abajo). Configuración de RXVT:

  • En el fichero ~/.Xdefaults puede configurar la apariencia del terminal rxvt (tipografía, color, etc) y la de otros programas gráficos. Por ejemplo, pon esto:
    rxvt*loginShell: true
    rxvt*scrollBar: false
    rxvt*foreground: black
    rxvt*background: #ffffe0
    rxvt*font: 8x16
    Rxvt*saveLines: 100000
    
  • Para que funcionen bien algunas teclas como Inicio y Fin y para que además Insert sirva para pegar, pon la siguiente línea en .bashrc
    export INPUTRC=$HOME/.inputrc
    

    y a continuación escribe las siguientes líneas en el fichero .inputrc

    # Home Key
    "\e[7~":beginning-of-line
    # End Key
    "\e[8~":end-of-line
    # Delete Key
    "\e[3~":delete-char
    # Insert Key
    "\e[2~":paste-from-clipboard
    
  • También puedes añadir una entrada "RXVT Here" en el menú contextual del explorador de Windows para abrir un terminal directamente con el pwd situado en ahí mismo, lo cual es muy útil.

    Descarga el fichero RXVT_Here.reg (o bien MSYS_Here.reg), haz click con el botón derecho sobre él y elige "Combinar" y ya está. Si quieres, puedes abrir este fichero con un editor de texto y editarlo para cambiar los parámetros de arranque de RXVT. Para borrar las entradas escritas en el registro puedes usar Regedit.exe (pero con cuidado...)
Problema con RXVT
No todos los programas Windows son compatibles con RXVT, aquellos que utilicen E/S directa al terminal (I/O Console System Calls) no funcionarán con RXVT (no mostrarán ninguna salida ni recibirán la entrada por teclado), así que en este caso hay que usar bash dentro del clásico cmd.exe

En el repositorio de paquetes de Cygwin hay algunos como Cygwin/X (servidor X para Windows) que tienen su propia configuración aunque la predeterminada es suficiente en la mayoría de los casos; si decides instalarlo deberás leer la documentación correspondiente.

bash en cmd.exe (predeterminado)
bash en cmd.exe (predeterminado)
bash en rxvt.exe
bash en rxvt.exe

Ejecuta Menú Inicio->Programas->Cygwin->Cygwin Bash Shell y comprueba que puedes usar los programas que has instalado, intenta compilar algún programa (paso 3 de MinGW)

Documentación extra

Ahora que ya has instalado Cygwin, tendrás que aprender a manejarlo. Si ya has usado anteriormente UNIX estarás como pez en el agua, seguro que ya conoces la mayoría de los programas. Aun así, conviene que leas la guía de usuario de Cygwin, seguro que descubres cosas nuevas como por ejemplo cómo instalar el servicio de SSH o montar directorios. Lee también los interesantes artículos (en español) sobre Cygwin en el blog de Vicente Navarro Jover.

La opción -mno-cygwin de gcc

La versión de gcc incluida en Cygwin tiene una opción especial llamada -mno-cygwin que es muy importante. Esta opción provoca que el programa compilado no se enlace con (ni dependa de) cygwin1.dll. Aparte de las DLLs que tú hayas indicado, dependerá de las obligatorias kernel32.dll, gdi32.dll... como cualquier aplicación nativa 100% Windows.

Esta opción, por tanto, permite usar gcc de Cygwin como un compilador normal y corriente para Windows, igual que MinGW, MSVC o BCC. Puedes ver las dependencias de un ejecutable cualquiera con la utilidad Dependency Walker (es el equivalente de la utilidad ldd de UNIX).

Referencias