</>waridocu

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.

cppgccg++compiladorinstalacionflags

Por qué esta página va primero

Todas las páginas de esta sección muestran, junto a cada ejemplo, un comando como este:

bashbash
g++ -std=c++17 -Wall -o programa programa.cpp

Antes 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.

Nota

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:

Debian, Ubuntu y derivadosbash
sudo apt update && sudo apt install build-essential

# Fedora
sudo dnf install gcc-c++

# Arch Linux
sudo pacman -S gcc

build-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):

bashbash
xcode-select --install
Nota

Si 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:

  1. MSYS2 (recomendado): instala un entorno con g++ real de GCC. Después de instalar MSYS2, desde su terminal:

    bashbash
    pacman -S mingw-w64-ucrt-x86_64-gcc

    y agrega la carpeta ucrt64/bin de MSYS2 al PATH del sistema para poder usar g++ desde cualquier terminal (cmd, PowerShell).

  2. WSL (Windows Subsystem for Linux): instala una distribución Linux real dentro de Windows (wsl --install desde 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.

Tip

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:

bashbash
g++ --version

Si 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:

bashbash
g++ -std=c++17 -Wall -o programa programa.cpp
ParteQué hace
g++El compilador que vas a invocar.
-std=c++17Qué versión del estándar de C++ usar (ver abajo).
-WallActiva las advertencias del compilador (ver abajo).
-o programaEl nombre que va a tener el archivo ejecutable resultante.
programa.cppEl 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:

FlagEstándar
-std=c++17C++17 — el que usa esta documentación por defecto
-std=c++20C++20
-std=c++23C++23, el más reciente ampliamente soportado
Advertencia

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.

bashbash
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++.

Tip

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:

  • -g incluye información de depuración (nombres de variables, líneas del código fuente) en el ejecutable, para que un depurador como gdb pueda 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).
FlagUso típico
-O0 (o ningún -O)Mientras desarrollas: compila rápido, sin optimizar, ideal junto con -g.
-O2Para 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.
-O3Optimización agresiva; a veces más rápido que -O2, a veces no — se mide, no se asume.
-OsOptimiza priorizando el tamaño del ejecutable antes que la velocidad.
Mientras desarrollás y depurásbash
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.cpp
Nota

No 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 — agrega ruta a 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 -lglfw para 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 .cpp a 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++?.