GCC vs G++: ¿Cuál es la diferencia y qué compilador de C++ elegir?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: El drama de los dos nombres

\n\n

Si alguna vez has intentado compilar un programa en C++ en Linux o macOS, seguramente te has topado con dos comandos similares: gcc y g++. A primera vista, la diferencia entre ellos es mínima: ambos ejecutan el compilador, ambos pueden trabajar con C y C++. Pero si te equivocas al elegir, obtienes una montaña de errores de enlazado que pueden arruinarle la tarde incluso a un desarrollador experimentado.

\n\n

Esta pregunta es una de las más populares en Stack Overflow (¡más de 200 000 visitas!). Los principiantes suelen pensar: «Si gcc puede compilar C++, ¿para qué sirve g++?». Y se equivocan. Hoy vamos a aclarar de una vez por todas cuál es el truco, con ejemplos de código reales. Aprenderás cuándo usar gcc, cuándo usar g++ y cómo no caer en la trampa de las dependencias implícitas.

\n\n

Breve repaso: ¿Qué es GCC?

\n\n

GCC (GNU Compiler Collection) no es un solo compilador, sino un conjunto completo de herramientas. Incluye compiladores para C, C++, Fortran, Ada y otros lenguajes. Históricamente, las siglas significaban «GNU C Compiler», pero con los años el proyecto creció.

\n\n

El comando gcc es un controlador que, por defecto, ejecuta el compilador para el lenguaje C. El comando g++ es el mismo controlador, pero con banderas que activan la compatibilidad con C++. Parece un detalle menor. Pero es precisamente ese «detalle» el que determina si tu código funcionará o no.

\n\n

La principal diferencia: enlazado de bibliotecas estándar

\n\n

Imagina que escribes un programa simple en C++:

\n\n
#include <iostream>\nint main() {\n    std::cout << "¡Hola, mundo!" << std::endl;\n    return 0;\n}\n
\n\n

Intentemos compilarlo de dos maneras:

\n\n
gcc main.cpp -o program_gcc\ng++ main.cpp -o program_gpp\n
\n\n

Resultado:

\n
    \n
  • g++ — la compilación se realiza con éxito.
  • \n
  • gcc — obtendrás un error de enlazado undefined reference to `std::cout'.
  • \n
\n\n

¿Por qué? Porque gcc no enlaza automáticamente la biblioteca libstdc++ (la biblioteca estándar de C++). Piensa que estás compilando C puro, y en C no existen iostream, std::string ni otras bondades de C++. g++, en cambio, lo hace automáticamente.

\n\n

Por supuesto, puedes forzar a gcc a trabajar con C++ manualmente añadiendo la bandera -lstdc++:

\n\n
gcc main.cpp -lstdc++ -o program_gcc_fixed\n
\n\n

Pero, ¿para qué reinventar la rueda? g++ lo hace «de fábrica».

\n\n

¿Y qué pasa con la compilación de C puro?

\n\n

Aquí todo es simétrico. Si escribes un programa en C e intentas compilarlo con g++, lo más probable es que funcione. Pero g++ interpretará el código como C++, lo que implica:

\n
    \n
  • Verificaciones de tipos más estrictas.
  • \n
  • Otras reglas para la conversión implícita de tipos.
  • \n
  • Posibles advertencias (warnings) falsas.
  • \n
\n\n

Ejemplo. Código en C:

\n\n
#include <stdio.h>\nint main() {\n    char *s = malloc(100);\n    printf("Hello\\n");\n    free(s);\n    return 0;\n}\n
\n\n

En C esto es normal. En C++ se necesita una conversión explícita (char*)malloc(100). g++ dará un error, mientras que gcc no. Conclusión: para proyectos en C usa gcc, para C++ usa g++.

\n\n

Extensiones de archivo: ¿cómo entiende el compilador el lenguaje?

\n\n

Otro matiz importante: gcc y g++ se fijan en la extensión del archivo.

\n\n
    \n
  • .c — se compila como C.
  • \n
  • .cpp, .cc, .cxx — se compila como C++.
  • \n
\n\n

Si le das a gcc un archivo con extensión .cpp, entenderá que es C++ y usará el frontend (compilador de lenguaje) correcto. Pero el enlazado seguirá siendo sin

Blogs

Book Recommendations