C++ Compilando con GCC


Ejemplo

Asumiendo un único archivo fuente llamado main.cpp , el comando para compilar y vincular un ejecutable no optimizado es el siguiente (Compilar sin optimización es útil para el desarrollo inicial y la depuración, aunque oficialmente se recomienda -Og para las versiones más recientes de GCC).

g++ -o app -Wall main.cpp -O0

Para producir un ejecutable optimizado para su uso en la producción, utilizar una de las -O opciones (véase: -O1 , -O2 , -O3 , -Os , -Ofast ):

g++ -o app -Wall -O2 main.cpp

Si se omite la opción -O, se utiliza -O0, que significa que no hay optimizaciones, como valor predeterminado (la especificación de -O sin un número se resuelve en -O1).

Alternativamente, use las marcas de optimización de los grupos O (o más optimizaciones experimentales) directamente. El siguiente ejemplo construye con la optimización de -O2 , más un indicador del nivel de optimización de -O3 :

g++ -o app -Wall -O2 -ftree-partial-pre main.cpp

Para producir un ejecutable optimizado específico de la plataforma (para su uso en producción en la máquina con la misma arquitectura), use:

g++ -o app -Wall -O2 -march=native main.cpp

Cualquiera de los anteriores producirá un archivo binario que puede ejecutarse con .\app.exe en Windows y ./app en Linux, Mac OS, etc.

La bandera -o también se puede omitir. En este caso, GCC creará una salida ejecutable predeterminada a.exe en Windows y a.out en sistemas similares a Unix. Para compilar un archivo sin vincularlo, use la opción -c :

g++ -o file.o -Wall -c file.cpp

Esto produce un archivo de objeto llamado file.o que luego puede vincularse con otros archivos para producir un binario:

g++ -o app file.o otherfile.o

Puede encontrar más información sobre las opciones de optimización en gcc.gnu.org . De particular interés son: -Og (optimización con énfasis en la experiencia de depuración, recomendada para el ciclo estándar de edición-compilación-depuración) y -Ofast (todas las optimizaciones, incluidas las que no tienen en cuenta el estricto cumplimiento de estándares).

La bandera -Wall habilita advertencias para muchos errores comunes y siempre debe usarse. Para mejorar la calidad del código, a menudo también se recomienda utilizar -Wextra y otros indicadores de advertencia que no están habilitados automáticamente por -Wall y -Wextra .

Si el código espera un estándar de C ++ específico, especifique qué estándar usar incluyendo la -std= . Los valores admitidos corresponden al año de finalización de cada versión del estándar ISO C ++. A partir de GCC 6.1.0, los valores válidos para el indicador std= son c++98 / c++03 , c++11 , c++14 y c++17 / c++1z . Los valores separados por una barra diagonal son equivalentes.

g++ -std=c++11 <file>

GCC incluye algunas extensiones específicas del compilador que están deshabilitadas cuando entran en conflicto con un estándar especificado por el -std= . Para compilar con todas las extensiones habilitadas, se puede utilizar el valor gnu++XX , donde XX es cualquiera de los años utilizados por los valores de c++ enumerados anteriormente.

El estándar predeterminado se utilizará si no se especifica ninguno. Para las versiones de GCC anteriores a 6.1.0, el valor predeterminado es -std=gnu++03 ; en GCC 6.1.0 y superior, el valor predeterminado es -std=gnu++14 .

Tenga en cuenta que debido a errores en GCC, el indicador -pthread debe estar presente en la compilación y enlace para que GCC admita la funcionalidad de subprocesamiento estándar C ++ introducida con C ++ 11, como std::thread y std::wait_for . Omitirlo cuando se usan funciones de subprocesamiento puede generar advertencias pero resultados no válidos en algunas plataformas.

Vinculación con bibliotecas:

Use la opción -l para pasar el nombre de la biblioteca:

g++ main.cpp -lpcre2-8
#pcre2-8 is the PCRE2 library for 8bit code units (UTF-8)

Si la biblioteca no está en la ruta de la biblioteca estándar, agregue la ruta con la opción -L :

g++ main.cpp -L/my/custom/path/ -lmylib

Se pueden vincular varias bibliotecas entre sí:

g++ main.cpp -lmylib1 -lmylib2 -lmylib3

Si una biblioteca depende de otra, ponga la biblioteca dependiente antes de la biblioteca independiente:

g++ main.cpp -lchild-lib -lbase-lib

O deje que el enlazador determine el pedido a través de --start-group y --end-group (nota: esto tiene un costo de rendimiento significativo):

g++ main.cpp -Wl,--start-group -lbase-lib -lchild-lib -Wl,--end-group