Está en la página 1de 3

El GCC

Las siglas GCC significan actualmente “GNU Compiler Collection“ (“Colección de


compiladores GNU”). Antes estas mismas siglas significaban “GNU C Compiler”
(“Compilador C de GNU”), si bien ahora se utilizan para denominar a toda una
colección de compiladores de diversos lenguajes como C, C++, Objetive C, Chill,
Fortran, y Java. Esta colección de compiladores está disponible para prácticamente
todos los Sistemas Operativos, si bien es característica de entornos UNIX libres y se
incluye en la práctica totalidad de distribuciones de GNU/Linux. En su desarrollo
participan voluntarios de todas las partes del mundo y se distribuye bajo la licencia GPL
(“General Public License”) lo que lo hace de libre distribución: está permitido hacer
copias de él y regalarlas o venderlas siempre que se incluya su código fuente y se
mantenga la licencia. Nosotros nos referiremos al GCC únicamente como el compilador
de C estándar en GNU/Linux.

Compilación básica

GCC es un compilador de línea de comandos, aunque existen numerosos IDE o


entornos de desarrollo que incluyen a GCC como su motor de compilación. La manera
más simple de llamar a GCC es esta:
gcc codigo.c –o ejecutable

Así el GCC compilará el código fuente que haya en “codigo.c” y generará un fichero
ejecutable en “ejecutable”. Si todo el proceso se ha desarrollado correctamente, el GCC
no devuelve ningún mensaje de confirmación. En realidad la opción “-o” para indicar el
fichero de salida no es necesaria, y si no se indica se guarda el resultado de la
compilación en el fichero “a.out”.
Muchos proyectos de software están formados por más de un fichero fuente, por lo que
habrá que compilar varios ficheros para generar un único ejecutable. Esto se puede
hacer de forma sencilla llamando a GCC con varios ficheros fuente y un ejecutable:
gcc menu.c bd.c motor.c –o juego

Sin embargo es bastante probable que todos los ficheros fuente de un mismo proyecto
no se encuentren en el mismo directorio, y que conforme el proyecto crezca, existan
muchos ficheros de cabeceras (los típicos “.h”) y se alojen en directorios diferentes.
Para evitar problemas a la hora de tratar con proyectos semejantes, podemos hacer uso
de la opción “-I” e incluir los ficheros que sean necesario. Imaginemos que tenemos un
proyecto en el que todos los ficheros fuente están dentro del directorio “src” y todos los
ficheros de cabeceras están en el directorio “include”. Podríamos compilar el proyecto
de la siguiente manera:
gcc ./src/*.c –Iinclude –o juego

Paso a paso

Hasta ahora hemos dado por hecho que es normal que un compilador realice todos los
pasos necesarios para obtener un ejecutable partiendo del código fuente, si bien esto no
tiene por qué ser así. A la hora de generar un ejecutable hay una serie de procesos
implicados:
1. Edición del código fuente → código fuente.
2. Preprocesado → código fuente preprocesado.
3. Compilación → código ensamblador.
4. Ensamblado → código objeto.
5. Enlazado → ejecutable.

Mediante el GCC pueden realizarse todos ellos secuencialmente hasta conseguir el


ejecutable. Eso es lo que hemos estado haciendo en los ejemplos anteriores, pero en
ocasiones es conveniente parar el proceso en un paso intermedio para evaluar los
resultados:

Con la opción “-E” detenemos el proceso en la etapa de preprocesado, obteniendo


código fuente preprocesado.
Con la opción “-S” se detiene en la etapa de compilación, pero no ensambla el código.
Con la opción “-c”, compila y ensambla el código, pero no lo enlaza, obteniendo código
objeto.

Si no indicamos ninguna de estas opciones, se realizarán las cuatro fases de las que se
encarga el GCC: preprocesado, compilación, ensamblado y enlazado.
Ahora ya controlamos más el proceso. Cuando un proyecto involucra muchos ficheros
es bastante normal que no todas sus partes tengan las mismas opciones de compilación.
Por ello es muy útil generar separadamente los respectivos códigos objeto, y cuando ya
estén todos generados, enlazarlos para obtener el ejecutable:
gcc –c bd.c –o bd.o
gcc –c motor.c –lgraphics –o motor.o
gcc –c menu.c –lcurses –o menu.o
gcc bd.o motor.o menu.o –o juego

Librerías

Conforme un proyecto va ganando entidad se hace casi irremediable el uso de librerías


(realmente son “bibliotecas”) de funciones, que permiten reutilizar código de manera
cómoda y eficiente.
Para utilizar librerías estándar en el sistema es necesario emplear la opción “-l” a la hora
de llamar a GCC:
gcc –c menu.c –lcurses –o menu.o

La compilación de este fichero (“menu.c”) requiere que esté instalada la librería curses
o ncurses en el sistema, por ejemplo (la librería se llamará casi con seguridad
“libncurses”). Si la librería no es una librería estándar en el sistema, sino que pertenece
únicamente a nuestro proyecto, podremos indicar la ruta empleando la opción “-L”:
gcc –c motor.c –L./libs/librería-motor –o motor.o
Programando en C para GNU/Linux

Llevamos varios apartados hablando de todo lo que rodea a la programación en


GNU/Linux, pero no terminamos de entrar en materia. En lo sucesivo comenzaremos
desde lo más básico, para ir posteriormente viendo las llamadas al sistema más comunes
y terminar con Intercomunicación Entre Procesos (IPC) y sockets en redes TCP/IP.

Hola, mundo!

Si hay un programa obligatorio a la hora de empezar a programar en un lenguaje de


programación, ese es el mítico “Hola, mundo!”. La manía de utilizar un programa que
saque por pantalla “Hola, mundo!” para mostrar un programa de ejemplo en un
determinado lenguaje se remonta –una vez más- a los orígenes de C y UNIX, con
Kerningan, Ritchie, Thompson y compañía haciendo de las suyas.
Para programar un “Hola, mundo!” en C para GNU/Linux simplemente tendremos que
editar un fichero, “hola.c”, que contenga algo similar a esto:
#include <stdio.h>

int main( int argc, char *argv[] )


{
printf( “Hola, mundo!\n” );

return 0;
}

Queda fuera del ámbito de este curso explicar de forma detallada la sintaxis de C, por lo
que pasaremos a analizar el proceso de compilación desde nuestro fichero fuente
(“hola.c”) al fichero ejecutable (“hola”):
txipi@neon:~$ gcc hola.c –o hola
txipi@neon:~$ ./hola
Hola, mundo!
txipi@neon:~$

Como podemos observar, el proceso es muy sencillo. Hay que tener especial cuidado en
añadir el directorio a la hora de llamar al ejecutable (“./hola”) porque en GNU/Linux la
variable PATH no contiene al directorio actual. Así, por mucho que hagamos “cd” para
cambiar a un determinado directorio, siempre tendremos que incluir el directorio en la
llamada al ejecutable, en este caso incluimos el directorio actual, es decir, “.”

También podría gustarte