Compilar con g++

337 palabras 2 minutos C++

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

-O0

Optimización básica

-O1

Optimización recomendada

-O2

Optimizació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

-Wall

Advertencias adicionales

-Wextra

Cumplimiento estricto del estándar

-Wpedantic

Una combinación muy utilizada es:

-Wall -Wextra

Seleccionar estándar de C++

C++17

-std=c++17

C++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

-m32

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