Compilar con g++
g++ tiene cientos de opciones, pero para la mayoría de los proyectos de escritorio en C++ (por ejemplo, usando wxWidgets y SQLite) hay un conjunto relativamente pequeño que conviene dominar.
Compilar un archivo fuente
g++ -c main.cpp
La opción -c indica que se compile el código pero sin enlazar.
Resultado:
main.cpp -> main.o
Especificar el nombre de salida
g++ main.cpp -o miapp
La opción -o permite definir el nombre del archivo generado.
Ejemplo:
g++ main.cpp -o contabilidad.exe
Agregar directorios de inclusión
g++ main.cpp -IC:\wxWidgets\include
La opción -I indica dónde buscar archivos de cabecera (.h).
Por ejemplo:
#include <wx/wx.h>
Agregar directorios de librerías
g++ main.o -LC:\libs
La opción -L indica dónde buscar librerías durante el enlazado.
Enlazar librerías
g++ main.o -lsqlite3
La opción -l enlaza una librería.
Por ejemplo:
-lsqlite3
buscará automáticamente:
libsqlite3.a
o
libsqlite3.dll.a
Optimización
Sin optimización
-O0Optimización básica
-O1Optimización recomendada
-O2Optimización agresiva
-O3
Ejemplo:
g++ -O2 main.cpp -o app
Información de depuración
-g
Genera información para depuradores como GDB.
Ejemplo:
g++ -g main.cpp
Advertencias del compilador
Advertencias básicas
-WallAdvertencias adicionales
-WextraCumplimiento estricto del estándar
-Wpedantic
Una combinación muy utilizada es:
-Wall -Wextra
Seleccionar estándar de C++
C++17
-std=c++17C++20
-std=c++20
Ejemplo:
g++ main.cpp -std=c++20
Enlazar estáticamente las librerías del compilador
-static-libgcc
-static-libstdc++
Estas opciones evitan tener que distribuir DLLs como:
libgcc_s_dw2-1.dll
libstdc++-6.dll
Intentar enlazado completamente estático
-static
Esto intenta enlazar todas las dependencias de forma estática.
En Windows suele funcionar razonablemente bien. En Linux puede ser más complicado debido a dependencias del sistema.
Crear una librería compartida
-shared
Ejemplo:
g++ -shared archivo.o -o libalgo.so
Generará:
libalgo.so
Código independiente de posición
-fPIC
Se utiliza principalmente para crear librerías compartidas (.so) en Linux.
Definir macros desde la línea de comandos
-DDEBUG
Es equivalente a escribir:
#define DEBUG
antes de compilar.
Ejemplo:
g++ main.cpp -DDEBUG
Generar dependencias
-M
Muestra los archivos de cabecera utilizados por el código.
Es especialmente útil para generar Makefiles.
Seleccionar arquitectura
Compilar para 32 bits
-m32Compilar para 64 bits
-m64
Ejemplo:
g++ main.cpp -m32
Soporte para hilos
-pthread
Necesario cuando se utilizan componentes como:
std::thread
std::mutex
std::condition_variable
En Linux suele ser obligatorio.
Mostrar información detallada del compilador
-v
Ejemplo:
g++ -v main.cpp
Muy útil para diagnosticar problemas de compilación.
Ver directorios de búsqueda del compilador
g++ -E -x c++ - -v < /dev/null
Muestra todos los directorios donde g++ busca cabeceras y librerías.
Ejemplo típico para Linux
g++ \
*.cpp \
-std=c++20 \
-O2 \
-Wall \
`wx-config --cxxflags --libs` \
-lsqlite3 \
-o contabilidad
Ejemplo típico para Windows (MinGW)
g++ \
*.cpp \
sqlite3.c \
-std=c++20 \
-O2 \
-Wall \
-static-libgcc \
-static-libstdc++ \
-o contabilidad.exe
Resumen
Si recién estás empezando, las opciones más importantes para aprender son:
-c
-o
-I
-L
-l
-O2
-g
-Wall
-Wextra
-std=c++20
-m32
-m64
-static-libgcc
-static-libstdc++
Con ellas cubrirás la gran mayoría de las necesidades de un proyecto moderno en C++.