Compilar programas en C y C++

Linux se ha convertido en una extraordinaria elección para desarrollar aplicaciones en buena parte de los lenguajes que existen actualmente: C, C++, Perl, Java, etc.

Para ello provee de una interfaz de programación avanzada que utiliza compiladores y herramientas GNU, como el compilador gcc, el depurador gdb, etc. (para C y C++).

El compilador gcc que propone Linux para C y C++ es uno de los más versátiles conocidos y admite todos los estándares C modernos. Además Linux proporciona las bibliotecas de clase C++, como la biblioteca de plantillas estándar (STL, Standard Template Library).

Compilar con gcc

Antes de utilizar el compilador tenemos que asegurarnos de que es visible desde nuestro terminal, o lo que es decir, que desde nuestro usuario y sesión podemos utilizarlo.

Hemos visto que cuando creamos una cuenta con linux también tenemos que crear un fichero de configuración .bashrc. En este fichero de configuración añadimos aquellos aspectos que consideremos necesarios para trabajar en nuestro entorno de usuario. Por ejemplo la variable PATH.

En esta variable pondremos los directorios donde se encuentran las herramientas que vamos a utilizar en nuestra sesión de usuario, entre las cuales puede estar el compilador gcc :

PATH=/usr/local/bin:/usr/bin

export $PATH

Esto va a ser imprescindible para utilizar el compilador, que por supuesto estará en algunos de estos directorios.

Para cambiar el valor de la variable en un momento determinado sin cambiar el fichero .bashrc, podemos escribir en nuestro terminal:

$ export PATH=$PATH:/usr/sbin

y de esta forma habremos añadido el directorio /usr/sbin a la variable PATH manteniendo los valores anteriores.

Para observar el valor de la variable ejecutamos el comando echo :

$ echo $PATH

/usr/local/bin:/usr/bin:/usr/sbin

Ahora para compilar el programa hola.c, por ejemplo, ejecutamos gcc de la siguiente forma:

#include <stdio.h>

int main() {

printf(“hola mundo\n”);

return 0

}

$ gcc –o hola hola.c

El compilador ha tenido que compilar su archivo fuente hola.c, en un archivo de objetos hola.o y enlazar hola.o con las bibliotecas y producir un ejecutable. Por supuesto hola.c tendrá que tener un programa principal (main) para generar un ejecutable.

El programa generado se ejecutaría de la forma :

$ ./hola

Para generar únicamente el fichero objeto hola.o, ejecutamos el compilador con la opción –c:

$ gcc –c hola.c

Para compilar varios archivos fuentes compilamos :

$ gcc –o hola saludos.c hola.c

Para poder depurar el programa con la herramienta de depuración gdb tenemos que utilizar la opción –g :

$ gcc –g –o hola saludos.c hola.c

Las librerías y los encabezados

A veces tenemos varios ficheros que queremos agrupar de forma lógica en una librería que contenga todos los objetos que necesita nuestro programa. Para crear dicha librería utilizamos el comando ar.

Primero creamos los objetos:

$ gcc –c cuadrado.c factorial.c

y los añadimos a la librería :

$ ar r libmates.a cuadrado.o factorial.o

Cada archivo fuente tendrá el encabezado libmates.h con los prototipos de las funciones y las constantes:

/* libmates.h : rutinas en libmates.a */

extern float cuadrado(float);

extern int factorial(int,int);

/ — home – eva — calc       – calculadora.c

— include  – libmates.h

— lib          – libmates.a

La compilación del programa principal calculadora.c con la librería en nuestro directorio de trabajo /home/eva/calc sería la siguiente:

$ gcc –I../include –L../lib –o calculadora calculadora.c –lmates

La opción –I.. indica el directorio donde se encuentran los encabezados, en un nivel superior en nuestra estructura de directorios

/home/eva/include/libmates.h

La opción –L.. indica el directorio donde se encuentra la librería, en un nivel superior en la estructura de directorios.

/home/eva/lib/libmates.a

Para enlazar librerías distintas de las estándar, se debe utilizar el conmutador –l en la linea de comandos gcc. Por ejemplo, si desea utilizar rutinas matemáticas    (especificadas en math.h ) debe añadir –lm al final del comando gcc para realizar el enlace a libm. El orden de las opciones es importante. Por ejemplo si la librería libmates utiliza rutinas que se encuentran en libm tiene que incluir –lm tras –lmates en la linea de comandos.

La mayoría de las librerías estándar se encuentran en /usr/lib. En este directorio se pueden encontrar librerías terminadas en .a (librerías estáticas) y librerías terminadas en .so (librerías dinámicas).Las librerías dinámicas contienen código que se enlazan con los programas en tiempo de ejecución y los paths que las contienen deben incluirse en la variable de entorno LD_LIBRARY_PATH.