Introducción: El drama de los dos nombres
\n\nSi 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.
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.
Breve repaso: ¿Qué es GCC?
\n\nGCC (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\nEl 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.
La principal diferencia: enlazado de bibliotecas estándar
\n\nImagina 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\nIntentemos compilarlo de dos maneras:
\n\ngcc main.cpp -o program_gcc\ng++ main.cpp -o program_gpp\n\n\nResultado:
\n- \n
g++— la compilación se realiza con éxito. \n gcc— obtendrás un error de enlazadoundefined reference to `std::cout'. \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.
Por supuesto, puedes forzar a gcc a trabajar con C++ manualmente añadiendo la bandera -lstdc++:
gcc main.cpp -lstdc++ -o program_gcc_fixed\n\n\nPero, ¿para qué reinventar la rueda? g++ lo hace «de fábrica».
¿Y qué pasa con la compilación de C puro?
\n\nAquí 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
- Verificaciones de tipos más estrictas. \n
- Otras reglas para la conversión implícita de tipos. \n
- Posibles advertencias (warnings) falsas. \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\nEn 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++.
Extensiones de archivo: ¿cómo entiende el compilador el lenguaje?
\n\nOtro matiz importante: gcc y g++ se fijan en la extensión del archivo.
- \n
.c— se compila como C. \n .cpp,.cc,.cxx— se compila como C++. \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