12/03/2014
La compilación de programas en Linux, especialmente aquellos que utilizan librerías externas, es una tarea fundamental para cualquier desarrollador. Este artículo profundiza en el uso de gcc, el compilador GNU, para lograr este objetivo de forma eficiente y efectiva, cubriendo desde los comandos básicos hasta técnicas más avanzadas.
GCC: El corazón de la compilación en Linux
GCC (GNU Compiler Collection) es el compilador de código fuente más popular en sistemas Linux y otros sistemas Unix-like. Su versatilidad y soporte para múltiples lenguajes de programación (C, C++, Fortran, Ada, entre otros) lo convierten en una herramienta esencial para cualquier programador.
GCC no solo compila el código, sino que también realiza otras tareas cruciales como la preprocesación (inclusión de archivos de cabecera, eliminación de comentarios), la generación de código ensamblador y la vinculación (linking) con las librerías necesarias. Este proceso se puede resumir en los siguientes pasos:
- Preprocesamiento: El preprocesador de GCC procesa las directivas de preprocesamiento (como #include y #define) antes de la compilación real.
- Compilación: El compilador traduce el código fuente en lenguaje ensamblador.
- Ensamblaje: El ensamblador convierte el código ensamblador en código objeto, un formato binario específico de la arquitectura del sistema.
- Vinculación: El enlazador combina el código objeto con las librerías necesarias para generar el programa ejecutable.
Comandos básicos de GCC
El comando básico de GCC para compilar un archivo fuente (por ejemplo, programa.c) y generar un ejecutable ( programa) es:
gcc programa.c -o programa
Donde:
gcc: invoca al compilador GCC .programa.c: es el nombre del archivo fuente.-o programa: especifica el nombre del archivo ejecutable de salida. Si se omite, el ejecutable se nombraráa.out.
Para compilar código C++, se utiliza la extensión .cppo .ccy se especifica el compilador de C++:
g++ programa.cpp -o programa
Compilación con librerías
Cuando un programa utiliza funciones o clases definidas en una librería externa, es necesario indicar a GCC dónde encontrar dichas librerías durante la vinculación. Esto se hace mediante la opción -l(el signo menos es importante), seguida del nombre de la librería sin el prefijo libni la extensión .ao .so.
Por ejemplo, para usar la librería matemática libm, se utilizaría:
gcc programa.c -lm -o programa
Si la librería no está en un directorio estándar, se debe especificar su ubicación con la opción -Lseguida del directorio:

gcc programa.c -L/ruta/a/la/libreria -lmiLibreria -o programa
Donde:
-L/ruta/a/la/libreria: especifica la ruta donde se encuentra la librería.-lmiLibreria: indica que se debe enlazar con la libreríalibmiLibreria.aolibmiLibreria.so.
Opciones de optimización
GCC ofrece diversas opciones para optimizar el código generado, mejorando su rendimiento y tamaño. La opción -O(mayúscula) activa la optimización. Existen diferentes niveles de optimización:
-O1: optimización de nivel 1 (optimización básica).-O2: optimización de nivel 2 (optimización más exhaustiva).-O3: optimización de nivel 3 (optimización aún más agresiva, puede aumentar el tiempo de compilación).-Os: optimización para reducir el tamaño del código.
Ejemplo de compilación con optimización de nivel 2:
gcc programa.c -O2 -o programa
Manejo de errores y depuración
Durante la compilación, pueden producirse errores que impiden la generación del ejecutable. GCC proporciona información detallada sobre los errores y advertencias, ayudando a identificar y corregir los problemas en el código fuente.
La opción -Wallactiva todas las advertencias, lo cual es recomendable durante el desarrollo:
gcc programa.c -Wall -o programa
Para la depuración, se puede utilizar la opción -g, que genera información de depuración para usar con herramientas como gdb(GNU Debugger):
gcc programa.c -g -o programa
Librerías comunes en Linux
A continuación, se muestra una tabla con algunas de las librerías más comunes utilizadas en la programación en Linux:
| Librería | Descripción | Opción de enlace |
|---|---|---|
libm | Librería matemática | -lm |
libc | Librería estándar de C | (enlazada automáticamente) |
libstdc++ | Librería estándar de C++ | (enlazada automáticamente con g++ ) |
pthread | Librería de hilos POSIX | -pthread |
ncurses | Librería para interfaces de texto | -lncurses |
Ejemplos de compilación con diferentes librerías
Ejemplo 1: Usando la librería matemática
Este ejemplo calcula la raíz cuadrada de un número utilizando la función sqrt()de la librería matemática:

#include <stdio.h>#include <math.h>int main() { double numero = 20; double raiz = sqrt(numero); printf("La raíz cuadrada de %.2lf es %.2lf", numero, raiz); return 0;}Compilación:
gcc programa.c -lm -o programa
Ejemplo 2: Usando la librería ncurses
Este ejemplo crea una simple ventana utilizando la librería ncurses:
#include <ncurses.h>int main() { initscr(); printw("Hola, entorno!"); refresh(); getch(); endwin(); return 0;}Compilación:
gcc programa.c -lncurses -o programa
Makefiles: automatizando la compilación
Para proyectos grandes con múltiples archivos fuente y dependencias, los Makefiles son una herramienta muy útil para automatizar el proceso de compilación. Un Makefile describe las dependencias entre los archivos y los comandos necesarios para compilarlos. El comando makelee el Makefile y ejecuta los comandos necesarios para generar los ejecutables.
Consideraciones adicionales
La correcta compilación de programas con librerías implica entender las dependencias entre archivos y la correcta gestión de los directorios de búsqueda para las librerías.
Siempre revise los mensajes de error y advertencia generados por GCC para identificar y solucionar cualquier problema.
La opción -vproporciona información detallada sobre el proceso de compilación. Puede ser útil para diagnosticar problemas complejos.
Explore las opciones de GCC para obtener mayor control sobre el proceso de compilación y las características del programa resultante. La documentación oficial de GCC es un recurso invaluable para profundizar en estos temas.
Si quieres conocer otros artículos parecidos a Comandos en linux para compilar con librerías puedes visitar la categoría Libros y Librerías.
