C++
El compilador g++: instalación, comandos y flags
Cómo instalar g++ en Windows, macOS y Linux, la anatomía del comando de compilación, y los flags que vas a usar todo el tiempo.
Por qué esta página va primero
Todas las páginas de esta sección muestran, junto a cada ejemplo, un comando como este:
g++ -std=c++17 -Wall -o programa programa.cppAntes de escribir tu primer .cpp, conviene entender qué es ese comando, cómo conseguirlo en tu computadora, y qué significa cada parte — para no tener que volver a preguntártelo cada vez que aparezca.
Qué es g++
g++ es el compilador de C++ del proyecto GCC (GNU Compiler Collection). Un compilador traduce el código fuente que escribes (texto, en un archivo .cpp) a un programa ejecutable que tu sistema operativo puede correr directamente. g++ no es el único compilador de C++ que existe — las alternativas más comunes son Clang (clang++, usado por defecto en macOS) y MSVC (el compilador de Microsoft, integrado en Visual Studio en Windows) — pero los tres entienden el mismo lenguaje C++ estándar y esta documentación usa g++ como referencia porque sus comandos son casi idénticos en las tres plataformas.
Si en algún lado ves gcc en vez de g++: son el mismo proyecto, pero gcc compila C y g++ compila C++ (y enlaza automáticamente la biblioteca estándar de C++, que gcc no hace por defecto). Para C++, usa siempre g++.
Instalación según tu sistema operativo
Linux
La mayoría de las distribuciones lo traen instalado o a un paso de estarlo:
sudo apt update && sudo apt install build-essential
# Fedora
sudo dnf install gcc-c++
# Arch Linux
sudo pacman -S gccbuild-essential (Debian/Ubuntu) instala g++ junto con otras herramientas de compilación básicas que vas a necesitar tarde o temprano (como make).
macOS
La forma más simple es instalar las Command Line Tools de Xcode, que incluyen clang++ registrado también bajo el nombre g++ (en macOS, g++ es en realidad un alias de Clang):
xcode-select --installSi específicamente necesitas el GCC real (no Clang) en macOS, se instala aparte con Homebrew: brew install gcc. Para el contenido de esta documentación no hace falta esa distinción — cualquiera de los dos compila los ejemplos igual.
Windows
En Windows hay dos caminos razonables:
-
MSYS2 (recomendado): instala un entorno con
g++real de GCC. Después de instalar MSYS2, desde su terminal:bashbashpacman -S mingw-w64-ucrt-x86_64-gccy agrega la carpeta
ucrt64/binde MSYS2 alPATHdel sistema para poder usarg++desde cualquier terminal (cmd, PowerShell). -
WSL (Windows Subsystem for Linux): instala una distribución Linux real dentro de Windows (
wsl --installdesde PowerShell como administrador) y, adentro, sigues los pasos de instalación de Linux de arriba. Es la opción más parecida a cómo compila la mayoría de tutoriales y proyectos open source.
Si además vas a usar Visual Studio en Windows, ya trae su propio compilador (MSVC) integrado — no necesitas instalar g++ para eso. Pero los comandos g++ de esta documentación no funcionan con MSVC tal cual: la sintaxis de sus flags es distinta.
Verificar que quedó instalado
En cualquier sistema, una vez instalado:
g++ --versionSi ves una respuesta con un número de versión (por ejemplo g++ (GCC) 13.2.0 o similar), quedó instalado correctamente. Si en cambio el sistema dice que no reconoce el comando, revisa el paso de instalación para tu sistema — en Windows, casi siempre es un tema del PATH que no incluye la carpeta donde quedó g++.
Anatomía del comando de compilación
Retomando el comando del principio:
g++ -std=c++17 -Wall -o programa programa.cpp| Parte | Qué hace |
|---|---|
g++ | El compilador que vas a invocar. |
-std=c++17 | Qué versión del estándar de C++ usar (ver abajo). |
-Wall | Activa las advertencias del compilador (ver abajo). |
-o programa | El nombre que va a tener el archivo ejecutable resultante. |
programa.cpp | El archivo fuente a compilar. |
El orden de los flags no suele importar, pero el archivo fuente y el nombre de salida sí van donde corresponde. Una vez compilado, se ejecuta con ./programa (Linux/macOS) o programa.exe / .\programa.exe (Windows).
-std: elegir el estándar de C++
C++ tiene varias versiones estandarizadas (viste la tabla completa en ¿Qué es C++?), y el compilador necesita que le digas cuál usar con -std=c++AA, donde AA son las dos últimas cifras del año del estándar:
| Flag | Estándar |
|---|---|
-std=c++17 | C++17 — el que usa esta documentación por defecto |
-std=c++20 | C++20 |
-std=c++23 | C++23, el más reciente ampliamente soportado |
Si omites -std, g++ compila con un estándar por defecto que varía según la versión del compilador instalada (y en versiones viejas, puede ser un estándar bastante antiguo). Eso significa que el mismo código puede compilar en tu máquina y fallar en la de otra persona, solo porque tienen versiones distintas de g++ con defaults distintos. Especifica siempre -std explícitamente — es la razón por la que todos los comandos de esta documentación lo incluyen.
-Wall y -Wextra: advertencias
-Wall (“todas las advertencias [comunes]”, el nombre es un poco engañoso: no son literalmente todas) le pide al compilador que te avise de patrones sospechosos que compilan igual, pero que casi siempre son errores del programador: una variable que declaraste y nunca usaste, una comparación que siempre da el mismo resultado, un if con un ; de más que lo deja vacío.
g++ -std=c++17 -Wall -Wextra -o programa programa.cpp-Wextra suma advertencias adicionales que -Wall no incluye por default. La combinación -Wall -Wextra es la que vas a ver recomendada en casi cualquier proyecto serio de C++.
Una advertencia (warning) no impide que el programa compile — a diferencia de un error, que sí lo bloquea. Pero tratar cada advertencia como si fuera un error (leerla y entenderla antes de seguir) ahorra horas de depuración más adelante: la mayoría de los bugs de punteros no inicializados y variables sin inicializar que viste antes, -Wall los detecta en el momento de compilar, no cuando el programa ya está fallando en producción.
-g y -O: depuración vs. optimización
Estos dos flags representan un mismo compromiso desde ángulos opuestos:
-gincluye información de depuración (nombres de variables, líneas del código fuente) en el ejecutable, para que un depurador comogdbpueda mostrarte exactamente dónde y por qué falló algo.-O(de optimization) le pide al compilador que reorganice el código generado para que corra más rápido o pese menos, a costa de que ya no se parezca tanto al código fuente original (lo cual complica depurarlo).
| Flag | Uso típico |
|---|---|
-O0 (o ningún -O) | Mientras desarrollas: compila rápido, sin optimizar, ideal junto con -g. |
-O2 | Para la versión final: buen balance entre velocidad de ejecución y tiempo de compilación. Es el nivel más usado en la práctica. |
-O3 | Optimización agresiva; a veces más rápido que -O2, a veces no — se mide, no se asume. |
-Os | Optimiza priorizando el tamaño del ejecutable antes que la velocidad. |
g++ -std=c++17 -Wall -g -O0 -o programa programa.cpp
# Para la versión que vas a distribuir
g++ -std=c++17 -Wall -O2 -o programa programa.cppNo mezcles -g con niveles altos de optimización si planeas depurar: el compilador puede reordenar o eliminar código al optimizar, y el depurador termina mostrando líneas que no se corresponden bien con lo que realmente se ejecuta.
Otros flags que vas a encontrar en esta documentación
Ya usaste (o vas a usar pronto) estos otros flags en ejemplos concretos:
-I ruta— agregarutaa la lista de carpetas donde el compilador busca archivos de#include. Lo viste al compilar Dear ImGui, donde el código fuente de la librería vive en una carpeta aparte.-l nombre— enlaza contra una biblioteca ya compilada (por ejemplo-lglfwpara GLFW). También en el ejemplo de ImGui.-fsanitize=address,undefined— activa los sanitizers, herramientas que detectan en tiempo de ejecución errores de memoria como los punteros colgantes. Los vas a ver en detalle en la página de Punteros.-c— compila un archivo.cppa un archivo objeto (.o) sin enlazarlo todavía a un ejecutable. Sirve para compilar cada archivo de un proyecto grande por separado y enlazarlos juntos después, algo que en la práctica maneja un sistema de build (como CMake) en vez de escribirse a mano — la misma idea que ya se mencionó al hablar de compilar ImGui.
Siguiente paso
Con el compilador instalado y el comando básico entendido, ya puedes seguir el resto de esta documentación al pie de la letra: cada bloque de código viene acompañado de su propio comando de compilación, listo para copiar. Continúa con ¿Qué es C++?.