Cómo compilar C y C++ en Linux con GCC

Si tenemos un archivo terminado en .c o .cpp, el código todavía no es un programa que podamos ejecutar. Primero hay que compilarlo y después enlazar las piezas necesarias para producir el ejecutable. GCC puede hacer todo en un solo comando para un ejemplo pequeño, pero separar ambos pasos ayuda mucho cuando aparece un error.

En C utilizaremos gcc; en C++, g++. El segundo selecciona el lenguaje C++ y enlaza automáticamente su biblioteca estándar. Usar gcc para un programa C++ puede compilar el archivo y fallar al final con referencias sin definir.

Instalar GCC, G++ y Make

En Ubuntu, Debian y Linux Mint instalamos el conjunto habitual de herramientas:

sudo apt update
sudo apt install build-essential

En Fedora podemos instalar los paquetes necesarios de forma explícita:

sudo dnf install gcc gcc-c++ make

En Arch Linux y derivadas están dentro del grupo base-devel:

sudo pacman -S base-devel

Después comprobamos qué compiladores tenemos realmente:

gcc --version
g++ --version
command -v gcc g++
Terminal mostrando la ubicación y versión de GCC
Esta captura antigua utiliza whereis gcc; command -v gcc nos da directamente el ejecutable que usará la terminal.

Compilar un programa en C

Creamos un archivo llamado hola.c con cualquier editor de texto:

#include <stdio.h>

int main(void)
{
    puts("Hola desde C");
    return 0;
}

Desde la misma carpeta lo compilamos así:

gcc -std=c17 -Wall -Wextra -Wpedantic -O0 -g hola.c -o hola

-o hola pone nombre al ejecutable. Las opciones -Wall -Wextra -Wpedantic muestran problemas que no siempre impiden compilar, pero suelen descubrir errores. -O0 -g deja el programa sin optimizaciones y añade información útil para depurarlo.

Si no aparecen errores, lo ejecutamos con:

./hola

No hace falta ejecutar chmod +x. El enlazador ya crea el resultado como archivo ejecutable.

Compilar un programa en C++

Para C++ creamos hola.cpp:

#include <iostream>

int main()
{
    std::cout << "Hola desde C++\n";
    return 0;
}

Esta vez utilizamos g++ y escogemos el estándar C++20:

g++ -std=c++20 -Wall -Wextra -Wpedantic -O0 -g hola.cpp -o hola-cpp
./hola-cpp
Programa C++ compilado mostrando un saludo en la terminal
El nombre puede cambiar, pero el ejecutable se abre desde la carpeta actual anteponiendo ./.

Compilar varios archivos por separado

Cuando un programa tiene varios archivos no necesitamos recompilarlo todo cada vez. La opción -c compila sin enlazar y produce un archivo objeto terminado en .o. Por ejemplo, si tenemos main.cpp y saludo.cpp:

g++ -std=c++20 -Wall -Wextra -Wpedantic -O0 -g -c main.cpp -o main.o
g++ -std=c++20 -Wall -Wextra -Wpedantic -O0 -g -c saludo.cpp -o saludo.o
g++ main.o saludo.o -o programa
./programa

Los dos primeros comandos comprueban cada archivo y generan objetos. El tercero los enlaza y resuelve las funciones que uno utiliza del otro. La documentación de GCC describe las etapas de preprocesado, compilación, ensamblado y enlazado, además de las salidas de -E, -S y -c.

Errores habituales al compilar

  • gcc: command not found: falta instalar el compilador o la terminal no lo encuentra en PATH.
  • fatal error: archivo.h: No such file or directory: falta una cabecera o el paquete de desarrollo de una biblioteca. No se resuelve descargando una cabecera suelta de cualquier web.
  • undefined reference: normalmente la compilación terminó, pero el enlazador no encontró una función. Puede faltar otro archivo objeto, una biblioteca o el uso de g++ para C++.
  • Permission denied al escribir la salida: estamos compilando en una carpeta sin permisos. Es mejor trabajar dentro de nuestra carpeta personal que ejecutar el compilador con sudo.

Para dos archivos, estos comandos son suficientes. Cuando el proyecto crece, un Makefile o CMake guarda las opciones y sólo recompila lo que ha cambiado. Aun así, entender primero qué hacen gcc, g++, -c y el enlazado evita que la herramienta de construcción se convierta en otra caja negra. Si algún error no queda claro, podéis copiar en los comentarios el comando y las primeras líneas del mensaje.

Sergio Almela

Senior Software Engineer con más de diez años de experiencia. Escribo sobre Linux, software libre, backend, arquitectura, rendimiento, testing e IA aplicada al desarrollo.

Ver todas las entradas de Sergio Almela →

2 comentarios en «Cómo compilar C y C++ en Linux con GCC»

  1. Hola, Como compilo desde linux ese mismo programa para ejecutarlo en Windows y no tener que pasar mis fuentes a windows y compilarlo desde alli?

    1. Hola, existe mingw, el cual ayuda a realizar esta tarea. Se instala de la siguiente forma:
      sudo apt-get install mingw32 mingw32-binutils mingw32-runtime

      Y se compila de la siguiente forma:
      i586-mingw32msvc-g++ -o aplicacion.exe aplicacion.cpp

      Esperamos que te sirva de ayuda.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *