MinGW

Uso de G++ para compilar programas en C++

 

 

Antes de seguir debes haber instalado MinGW en tu sistema Windows. Si no lo ha hecho aún, consulta el documento MinGW (G++) en esta misma sección Herramientas de desarrollo del Campus Virtual. Sigue sus instrucciones para instalar MinGW.

En los sistemas Linux G++ está instalado por defecto, así que se puede usar como se indica aquí sin necesidad de instalar nada previamente.

G++ es un compilador de línea de órdenes que compila y enlaza programas en C++, generando el correspondiente archivo ejecutable. Para poder ejecutar las órdenes de compilación de G++ necesitamos una consola (o ventana de terminal), que es una ventana de modo texto que permite dar instrucciones al sistema operativo (SO) ejecutando órdenes una por una.

El SO entiende una serie de órdenes por defecto (dir, cd, copy, move, ...), cada una con su sintaxis que hay que respetar. Y a medida que instalamos determinados programas se añaden órdenes que se pueden ejecutar en la consola. Por ejemplo, tras instalar MinGW podemos usar la orden g++ para compilar programa en C++. La orden g++ también tiene su sintaxis particular que debemos conocer y respetar para poder escribir y ejecutar las órdenes de compilación correctamente.

Para abrir una consola usa la opción Símbolo del sistema del grupo de programas Accesorios. Se abrirá una ventana similar a esta:

Como ves, es una ventana en modo texto. Lo único que se pueden mostrar son filas de caracteres. No hay gráficos.

En las consolas siempre hay un indicativo (prompt) al que le sigue un cursor de texto parpadeante que indica dónde se pondrá el siguiente carácter que se escriba (al principio, tras el indicativo, o tras el último carácter escrito). En la ilustración, el indicativo es C:\Documents and Settings\Luis> y el cursor tiene la forma de un guión bajo (o subrayado). El tu ventana lo verás parpadear.

El indicativo por defecto muestra la carpeta actual seguida del símbolo mayor que (>). El cursor está esperando que escribamos una orden. Por ejemplo, escribe dir. Es la orden que te permite ver el contenido de la carpeta actual. Una vez escrita una orden la ejecutamos pulsando la tecla Intro. Hazlo y verás aparecer un listado de las subcarpetas y archivos que hay en esa carpeta (C:\Documents and Settings\Luis, en mi caso):

(Puedes alargar la ventana hacia abajo para ver más líneas.) El listado tiene cinco columnas: la fecha y la hora de creación o modificación, si se trata de una subcarpeta (<DIR>), el tamaño del archivo (en bytes) y el nombre del archivo o carpeta. La subcarpeta .. es especial, ya que hace referencia a la carpeta madre (en este ejemplo, C:\Documents and Settings).

Otra orden que necesitas conocer es la que te permite cambiar a otras carpetas. Es cd y debe llevar a continuación (separado por un espacio) el nombre de la (sub)carpeta a la que queremos ir. O .., para ir a la carpeta madre. Ejecuta cd .. y llegarás a la carpeta madre. Lo sabrás porque el indicativo así lo dice:

Puedes observar también que al ir ejecutando órdenes y al salir las líneas que producen las órdenes se van desplazando las líneas anteriores hacia arriba y se dejan de ver. Si queremos volver a verlas podemos utilizar la barra de desplazamiento de la ventana.

Bueno, ya vas conociendo algunas órdenes del SO que utilizarás a menudo en las consolas. Usarás pocas más, ya que lo que nos interesa es compilar programas, lo que haremos siempre con la orden g++ que MinGW ha añadido al instalarse.

Con cd te puedes desplazar a la carpeta en que estén los archivos con el código C++ que deseas compilar. Y dir te servirá para ver los nombres de esos archivos. Pero los archivos los crearás y editarás más cómodamente con una aplicación Windows con todas sus facilidades. Y las operaciones de mantenimiento de los archivos, con el Explorador de Windows.

Antes de compilar nuestro primer programa C++ vamos a organizarnos un poco. Vamos a crear una carpeta en la que ir colocando los distintos programas que iremos desarrollando a lo largo del curso. Llamémosla FP. La crearemos en la raíz del disco, para que nos cueste poco llegar a ella en la ventana de consola. Ejecuta en la consola la orden cd .. hasta que ya no produzca ningún cambio. (Por cierto, puedes volver a ejecutar órdenes anteriores usando las teclas de flecha arriba y abajo para ir recorriendo el historial de órdenes; para quitar la que haya basta con que pulses la tecla Esc.)

Estarás ahora en la carpeta raíz del disco. El indicativo sólo muestra la letra de la unidad de disco, dos puntos y una barra invertida (aparte del >):

Puedes crear las carpetas utilizando el Explorador de Windows, o ejecutar en la consola las instrucciones siguientes. Para crear la carpeta FP, ejecuta mkdir FP. mkdir es la orden que permite crear una subcarpeta. Cambia a esa nueva carpeta ejecutando cd FP. Como vamos a desarrollar muchos programas a lo largo del curso, organicemos un poco más creando subcarpetas para las distintas unidades (y prácticas). Asegúrate de que estás en la carpeta FP (mira el indicativo actual). Ejecuta mkdir Unidad02 (o mkdir Tema2, lo que prefieras). Y pasa esa nueva carpeta con cd Unidad02 (o cd Tema2).

Ya estás en la carpeta donde queremos compilar. ¿Compilar qué? Como acabamos de crear la carpeta, no hay nada en ella (ejecuta dir):

. representa la propia carpeta actual y .. la carpeta madre. Esos dos elementos siempre están. Pero no hay nada más, ningún programa en C++. (Si quieres borrar el contenido de la consola usa la orden cls.)

Pongamos el programa Hola Mundo! para una primera prueba de compilación. Pulsa el siguiente vínculo que aparece a continuación. Te abrirá una nueva ficha (o ventana) con el texto del programa.

Programa Hola Mundo!

Usa los menús del navegador para guardar el documento abierto. Asegúrate de que se guarde como archivo de texto (*.txt) y que tenga el nombre hola.cpp. Una vez hecho, vuelve a la ventana de consola y ejecuta dir:

Ya debe aparecer el archivo hola.cpp. Si, por cualquier motivo, el archivo tuviera un nombre diferente, usa la orden ren (renombrar) para que tenga el deseado. Por ejemplo, si el archivo se llama hola_cpp.txt, ejecuta la orden ren hola_cpp.txt hola.cpp.

Ahora que ya tenemos un programa en la carpeta, podemos compilarlo para que se genere el correspondiente archivo ejecutable. Como ya sabemos, usaremos la orden g++. La sintaxis básica para compilar un programa es la siguiente:

g++ -o ejecutable programa.cpp

Donde ejecutable es el nombre que queremos para el archivo ejecutable resultante (si todo va bien) y programa es el nombre del programa (siempre con extensión .cpp). En este caso, programa es hola y como archivo ejecutable podemos elegir hola.exe (si no ponemos extensión, añadirá .exe automáticamente). Así, en nuestro caso la orden será:

g++ -o hola.exe hola.cpp

Básicamente lo que le decimos a G++ es que compile una serie de archivos de código (aquí sólo hay uno, pero podríamos poner varios .cpp, separados por un espacio). Además, podemos incluir opciones de compilación. Las opciones empiezan por un guión (-) y cada una tiene una letra que la identifica. Por ejemplo -o es la opción de compilación que permite dar un nombre a la salida (output) de la compilación (la salida es el programa ejecutable). Hay muchas opciones de compilación, pero de momento nos basta con -o. Aprenderás alguna otra a lo largo del curso.

Escribe y ejecuta la orden anterior en la consola:

Si no pasa nada, entonces todo ha ido bien. Si G++ no muestra ningún mensaje, entonces es que no ha habido ningún error de compilación. Se habrá generado el ejecutable y se podrá ejecutar. Ejecuta dir y verás cómo ya tienes un archivo hola.exe. Los archivos ejecutables se identifican como tales al tener la extensión .exe. Basta ejecutar su nombre (sin la extensión) para que pongan en marcha. Ejecuta hola:

¡Enhorabuena! Ya has conseguido compilar y ejecutar tu primer programa en C++.

Pero es importante que sepas qué ocurre cuando no todo va bien, cuando cometemos errores de programación. Para comprobar qué hace G++ cuando encuentra errores, edita el programa (hola.cpp) y:

Para cada caso, compila y vuelve a dejar el programa como estaba tras comprobar el efecto del cambio.

¿Qué ocurre en el primer caso, por ejemplo? Pues que no se entiende los que son los identificadores cout y endl:

Bastante lógico, al estar definidos esos identificadores en la biblioteca iostream. Aparecen dos errores de compilación que hay que solucionar (volviendo a añadir la cabecera en este caso).

Investiga por tu cuenta lo que ocurre en los demás casos.