¿Cuál es la diferencia entre g++ y gcc?
¿Cuál es la diferencia entre g++ y gcc? ¿Cuál de ellos debería usarse para el desarrollo general de C++?
gcc
y g++
son controladores de compilador de la Colección de Compiladores GNU (que alguna vez fue solo el Compilador GNU C ).
Aunque determinan automáticamente a qué backends ( cc1
cc1plus
...) llamar según el tipo de archivo, a menos que se anulen con -x language
, tienen algunas diferencias.
La diferencia probablemente más importante en sus valores predeterminados es con qué bibliotecas se vinculan automáticamente.
De acuerdo con las opciones de enlace de la documentación en línea de GCC y cómo se invoca g++ , g++
es aproximadamente equivalente a gcc -xc++ -lstdc++ -shared-libgcc
(la primera es una opción del compilador, las dos segundas son opciones del enlazador). Esto se puede verificar ejecutando ambos con la -v
opción (muestra los comandos de la cadena de herramientas del backend que se están ejecutando).
De forma predeterminada (y a diferencia de gcc
), g++ también agrega la opción de vinculación-lm
, para vincular libm
la que contiene implementaciones para math.h
.
GCC: Colección de compiladores GNU
- Referencias a todos los diferentes lenguajes soportados por el compilador GNU.
gcc
: Compilador GNU C
g++
: Compilador GNU C++
Las principales diferencias:
gcc
compilará:*.c\*.cpp
archivos como C y C++ respectivamente.g++
compilará:*.c\*.cpp
archivos pero todos serán tratados como archivos C++.- Además, si utiliza
g++
para vincular los archivos objeto, se vincula automáticamente en las bibliotecas estándar de C++ (gcc
no hace esto). gcc
La compilación de archivos C tiene menos macros predefinidas.gcc
compilar*.cpp
yg++
compilar*.c\*.cpp
archivos tiene algunas macros adicionales.
Macros adicionales al compilar *.cpp
archivos:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Para c++ deberías usar g++.
Es el mismo compilador (por ejemplo, la colección de compiladores GNU). GCC o G++ simplemente eligen una interfaz diferente con diferentes opciones predeterminadas.
En pocas palabras: si usa g++, la interfaz le indicará al vinculador que es posible que desee vincularse con las bibliotecas estándar de C++. La interfaz de gcc no hará eso (también podría vincularse con ellos si pasa las opciones de línea de comando correctas).
¿ Cuál es la diferencia entre g++
y gcc
?
gcc
ha evolucionado de un "compilador GNU C" de un solo lenguaje a una "colección de compiladores GNU" multilingüe. En ocasiones, el término gcc
todavía puede referirse al "compilador GNU C" en el contexto de la programación en C.
man gcc
# GCC(1) GNU
#
# NAME
# gcc - GNU project C and C++ compiler
Sin embargo, g++
es la interfaz del compilador C++ para la colección de compiladores GNU. Al igual gnat
que la interfaz del compilador Ada para gcc
. consulte Uso de la colección de compiladores GNU (GCC)
Por ejemplo, el comando Ubuntu 16.04 y 18.04 man g++
devuelve la GCC(1)
página del manual.
Ubuntu 16.04 y 18.04 man gcc
establece que...
g++
acepta principalmente las mismas opciones quegcc
y que por defecto...
... el uso de
gcc
no agrega la biblioteca C++.g++
es un programa que llama a GCC y especifica automáticamente el enlace con la biblioteca de C++. Trata los archivos .c, .h y .i como archivos fuente C++ en lugar de archivos fuente C, a menos que se utilice -x. Este programa también es útil al precompilar un archivo de encabezado C con una extensión .h para usar en compilaciones de C++.
Busque en las gcc
páginas de manual para obtener más detalles sobre las variaciones de opciones entre gcc
y g++
.
¿Cuál debería usarse para el desarrollo general de C++?
Técnicamente, gcc
o g++
puede usarse para el desarrollo general de C++ con la configuración de opciones aplicable. Sin embargo, el g++
comportamiento predeterminado está naturalmente alineado con un desarrollo en C++.
Se agregó la página de manual 'gcc' de Ubuntu 18.04 , y Ubuntu 20.04 continúa teniendo el siguiente párrafo:
La forma habitual de ejecutar GCC es ejecutar el ejecutable llamado
gcc
, omachine-gcc
al realizar una compilación cruzada, omachine-gcc-version
ejecutar una versión específica de GCC. Cuando compilas programas C++, deberías invocar GCC comog++
.
Nota al margen: en el caso de la cadena de herramientas integrada Xcode.app, g++
simplemente se vincula a gcc
. Por lo tanto, g++
las invocaciones pueden variar según la cadena de herramientas.
ls -l /Applications/Xcode.app/Contents/Developer/usr/bin
# …
# lrwxr-xr-x 1 root wheel 3 Apr 27 2021 g++ -> gcc
# -rwxr-xr-x 1 root wheel 167120 Nov 23 20:51 gcc
### -- versus --
which -a g++
# /usr/bin/g++
ls -l /usr/bin/g++
# -rwxr-xr-x 1 root wheel 137616 Jan 1 2020 /usr/bin/g++
Una diferencia notable es que si pasa un .c
archivo a gcc, se compilará como C.
El comportamiento predeterminado de g++ es tratar .c
los archivos como C++ (a menos que -x c
se especifique).