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.cppLa opción -c indica que se compile el código pero sin enlazar.
Resultado:
main.cpp -> main.oEspecificar el nombre de salida
g++ main.cpp -o miappLa opción -o permite definir el nombre del archivo generado.
Ejemplo:
g++ main.cpp -o contabilidad.exeAgregar directorios de inclusión
g++ main.cpp -IC:\wxWidgets\includeLa 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:\libsLa opción -L indica dónde buscar librerías durante el enlazado.
Enlazar librerías
g++ main.o -lsqlite3La opción -l enlaza una librería.
Por ejemplo:
-lsqlite3buscará automáticamente:
libsqlite3.ao
libsqlite3.dll.aOptimización
Sin optimización
-O0Optimización básica
-O1Optimización recomendada
-O2Optimización agresiva
-O3Ejemplo:
g++ -O2 main.cpp -o appInformación de depuración
-gGenera información para depuradores como GDB.
Ejemplo:
g++ -g main.cppAdvertencias del compilador
Advertencias básicas
-WallAdvertencias adicionales
-WextraCumplimiento estricto del estándar
-WpedanticUna combinación muy utilizada es:
-Wall -WextraSeleccionar estándar de C++
C++17
-std=c++17C++20
-std=c++20Ejemplo:
g++ main.cpp -std=c++20Enlazar 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.dllIntentar enlazado completamente estático
-staticEsto 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
-sharedEjemplo:
g++ -shared archivo.o -o libalgo.soGenerará:
libalgo.soCódigo independiente de posición
-fPICSe utiliza principalmente para crear librerías compartidas (.so) en Linux.
Definir macros desde la línea de comandos
-DDEBUGEs equivalente a escribir:
#define DEBUGantes de compilar.
Ejemplo:
g++ main.cpp -DDEBUGGenerar dependencias
-MMuestra 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
-m64Ejemplo:
g++ main.cpp -m32Soporte para hilos
-pthreadNecesario cuando se utilizan componentes como:
std::thread
std::mutex
std::condition_variableEn Linux suele ser obligatorio.
Mostrar información detallada del compilador
-vEjemplo:
g++ -v main.cppMuy útil para diagnosticar problemas de compilación.
Ver directorios de búsqueda del compilador
g++ -E -x c++ - -v < /dev/nullMuestra 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 contabilidadEjemplo típico para Windows (MinGW)
g++ \
*.cpp \
sqlite3.c \
-std=c++20 \
-O2 \
-Wall \
-static-libgcc \
-static-libstdc++ \
-o contabilidad.exeResumen
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++.