GCC para Windows
From JavierValcarce.Es
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
lddde 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
- Instala MinGW-X.Y.exe en C:\MINGW
- Instala MSYS-X.Y.exe en C:\MSYS
- 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
- Crea un directorio personal (HOME) y añade la variable HOME = C:\TU_DIRECTORIO_PERSONAL, te recomiendo que no haya espacios en el nombre
- 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
~/.profiley~/.bashrcexactamente 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
- Crea un directorio personal para ti (HOME), te recomiendo que el nombre no tenga espacios, por ejemplo C:\HOME es perfecto
- Define la variable
HOME = C:\HOME(Panel de Control->Sistema->Avanzado->Variables de entorno). En bash, este directorio se representa simplemente como~(gusanito) - 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. - 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
~/.Xdefaultspuede 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
InicioyFiny para que ademásInsertsirva para pegar, pon la siguiente línea en.bashrcexport 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
pwdsituado 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 usarRegedit.exe(pero con cuidado...)
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.
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).

