gccy g++son controladores de compilación de la colección de compiladores de GNU (que alguna vez fue solo el compilador de GNU C ).
Aunque determinan automáticamente qué backends ( cc1cc1plus...) llamar según el tipo de archivo, a menos que se anulen -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 documentación en línea de GCC y cómo se invoca g ++ , g++es equivalente a gcc -xc++ -lstdc++ -shared-libgcc(el primero es una opción de compilador, el segundo dos son opciones de enlace). Esto se puede verificar ejecutando ambos con la -vopción (muestra los comandos de la cadena de herramientas del backend que se están ejecutando).
De esta respuesta, llego a la conclusión de que efectivamente el comando g ++ es solo gcc con un grupo de banderas. ¿Por qué entonces, hay dos binarios diferentes (de aproximadamente el mismo tamaño) para gcc y g ++ en linux? ¿No deberíamos tener solo un binario y un enlace simbólico (o algo por el estilo)?
UchihaItachi
99
@Uchihaltachi estos archivos son enlaces duros y cuando se inician, verifican argv[0]qué invocación se debe usar. Esto es bastante común entre las principales utilidades de UNIX.
Disfrute el
439
GCC: Colección del compilador GNU
Referencias a todos los idiomas diferentes que son compatibles con el compilador GNU.
gcc: Compilador g++GNU C: Compilador GNU C ++
Las principales diferencias:
gcccompilará: *.c\*.cpparchivos como C y C ++ respectivamente.
g++compilará: *.c\*.cpparchivos pero todos serán tratados como archivos C ++.
Además, si utiliza g++para vincular los archivos de objeto, se vincula automáticamente en las bibliotecas estándar de C ++ ( gccno hace esto).
gcc compilar archivos C tiene menos macros predefinidas.
gcccompilar *.cppy g++compilar *.c\*.cpparchivos tiene algunas macros adicionales.
Puede vincular la biblioteca estándar de C ++ gccpasando el -lstdc++parámetro.
Denilson Sá Maia
16
Hay más diferencias entre 'gcc' y 'g ++' que solo las bibliotecas estándar, por gcc -lstdc++lo que aún no obtendrá el mismo comportamiento que g++. Ponemos todo ese comportamiento específico del idioma en su propio controlador por una razón, para eso está ahí. :-)
Ti Strga
8
Mi comentario no habla solo de vincular ... ese es el punto. Incluso restringiendo la discusión a la vinculación (que no fue su respuesta), un usuario aún no podrá usar toda la biblioteca estándar de C ++ especificando -lstdc++, ya que faltarán dependencias en matemática, RTTI e información de excepción. Si un caso de prueba determinado se vincula o falla, dependerá del sistema operativo y de las características de C ++ utilizadas por el caso de prueba, razón por la cual todo ese conocimiento está integrado en el controlador de g ++ en lugar de dejar que el usuario lo descubra. .
Ti Strga
10
Confía en mí, tenemos esta discusión mucho, generalmente cuando un usuario de Linux intenta mover su Makefile incompleto a otra plataforma. :-) La etapa de enlace g ++ hace mucho más que gcc -lstdc++en otros sistemas operativos, especialmente cuando el objetivo es una plataforma integrada. Afortunadamente, por eso enviamos un g ++ en primer lugar.
Ti Strga
10
Las cadenas de especificaciones se construyen para ser específicas del compilador, que a su vez son específicas del sistema operativo y el destino. Entonces, si ejecuta -dumpspec(por ejemplo) un compilador cruzado dirigido a un sistema incrustado, verá las diferencias. Hay más que solo diferencias de enlazador ... que de nuevo, de eso se trataba su respuesta (macros de preprocesador, incluyen rutas, múltiples bibliotecas de tiempo de ejecución). Parece que estamos hablando unos de otros, pero como antiguo mantenedor de GCC, le aseguro que estoy familiarizado con cuáles son y cuáles no son las interfaces.
Ti Strga
82
Para c ++ deberías usar g ++.
Es el mismo compilador (por ejemplo, la colección del compilador GNU). GCC o G ++ simplemente elija un front-end diferente con diferentes opciones predeterminadas.
En pocas palabras: si usa g ++, el frontend le dirá al enlazador que es posible que desee enlazar con las bibliotecas estándar de C ++. El frontend de gcc no hará eso (también podría vincularse con ellos si pasa las opciones de línea de comando correctas).
+1 También mi página de manual de gcc GNU / Linux dice: "Cuando compilas programas C ++, deberías invocar GCC como g ++ en su lugar".
Vista elíptica
35
¿Cuál es la diferencia entre g++y gcc?
gccha evolucionado de un solo lenguaje "GNU C Compiler" a una "Colección de compiladores GNU" en varios idiomas. El término "compilador GNU C" todavía se usa a veces en el contexto de la programación C.
Por ejemplo, el man g++comando Ubuntu 16.04 y 18.04 devuelve la GCC(1)página del manual.
Ubuntu 16.04 y 18.04 man gccestablece que ...
g++ acepta principalmente las mismas opciones que gcc
y que por defecto ...
... el uso de gccno agrega la biblioteca C ++. g++es un programa que llama a GCC y especifica automáticamente la vinculación con la biblioteca de C ++. Trata los archivos .c, .h e .i como archivos fuente C ++ en lugar de archivos fuente C, a menos que se use -x. Este programa también es útil al precompilar un archivo de encabezado C con una extensión .h para usar en compilaciones C ++.
Busque en las gccpáginas del manual para obtener más detalles sobre las variaciones de opciones entre gccy g++.
¿Cuál debería usarse para el desarrollo general de c ++?
Técnicamente, gcco g++se puede usar 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 de C ++.
La forma habitual de ejecutar GCC es ejecutar el ejecutable llamado gcc, o machine-gcccuando se realiza una compilación cruzada, o machine-gcc-versionejecutar una versión específica de GCC. Cuando compila programas C ++, debe invocar GCC como en su g++lugar.
(Tarde, pero para la posteridad). Como han señalado otras respuestas, esta no es "la única diferencia notable", a menos que el lector tenga una definición sesgada de notoriedad.
underscore_d
16
Aunque los comandos gcc y g ++ hacen cosas muy similares, g ++ está diseñado para ser el comando que invocaría para compilar un programa C ++; está destinado a hacer automáticamente lo correcto.
Detrás de escena, son realmente el mismo programa. Según tengo entendido, ambos deciden si compilar un programa como C o como C ++ en función de la extensión del nombre de archivo. Ambos son capaces de vincularse con la biblioteca estándar de C ++, pero solo g ++ lo hace de manera predeterminada. Entonces, si tiene un programa escrito en C ++ que no necesita vincularse con la biblioteca estándar, gcc hará lo correcto; pero entonces, también lo haría g ++. Entonces, realmente no hay razón para no usar g ++ para el desarrollo general de C ++.
Si mira el árbol de procesos, entonces parece que gcc y g ++ son backend para otras herramientas, que en mi entorno son: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc funciona bien como metatool para si tiene la extensión correcta o establece los indicadores -std -x correctos. Ver esto
"GCC" es un término abreviado común para la colección del compilador GNU. Este es el nombre más general para el compilador, y el nombre utilizado cuando se hace hincapié en compilar programas en C (ya que la abreviatura significaba "Compilador C GNU").
Cuando se hace referencia a la compilación de C ++, es habitual llamar al compilador "G ++". Como solo hay un compilador, también es preciso llamarlo "GCC" sin importar el contexto del lenguaje; sin embargo, el término "G ++" es más útil cuando el énfasis está en compilar programas C ++.
Estaba probando gcc y g ++ en un sistema Linux. Al usar MAKEFILE, puedo definir el compilador utilizado por "GNU make". Probé con la llamada función de localización de "memoria dinámica" de "C plus plus":
int main(){int* myptr =newint;* myptr =1;
printf("myptr[0] is %i\n",*myptr);return0;}
Solo g ++ puede compilarse correctamente en mi computadora, mientras que gcc informará un error
undefined reference to `operator new(unsigned long)'
Por lo tanto, mi propia conclusión es que gcc no es totalmente compatible con "C plus plus". Parece que elegir g ++ para archivos fuente C ++ es una mejor opción.
Tiene que hacer dos trabajos: 1. seleccione el idioma 2. elija alguna biblioteca como libstdc ++
PersianGulf
-1
gcc y g ++ son compiladores de GNU. Ambos compilan c y c ++. La diferencia es para los archivos * .c gcc lo trata como un programa de ca, y g ++ lo ve como un programa de ac ++. Los archivos * .cpp se consideran programas c ++. c ++ es un superconjunto de c y la sintaxis es más estricta, así que tenga cuidado con el sufijo.
C ++ es un lenguaje diferente, no un superconjunto estricto de C, por lo que compilar con el lenguaje de destino incorrecto podría producir resultados inesperados. También tenga en cuenta que g++también se interpretará .cccomo una extensión de nombre de archivo solo en C ++.
Respuestas:
gcc
yg++
son controladores de compilación de la colección de compiladores de GNU (que alguna vez fue solo el compilador de GNU C ).Aunque determinan automáticamente qué backends (
cc1
cc1plus
...) llamar según el tipo de archivo, a menos que se anulen-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 documentación en línea de GCC y cómo se invoca g ++ ,
g++
es equivalente agcc -xc++ -lstdc++ -shared-libgcc
(el primero es una opción de compilador, el segundo dos son opciones de enlace). 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).fuente
argv[0]
qué invocación se debe usar. Esto es bastante común entre las principales utilidades de UNIX.GCC: Colección del compilador GNU
gcc
: Compiladorg++
GNU C: 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 ++.g++
para vincular los archivos de objeto, se vincula automáticamente en las bibliotecas estándar de C ++ (gcc
no hace esto).gcc
compilar archivos C tiene menos macros predefinidas.gcc
compilar*.cpp
yg++
compilar*.c\*.cpp
archivos tiene algunas macros adicionales.Macros adicionales al compilar
*.cpp
archivos:fuente
gcc
pasando el-lstdc++
parámetro.gcc -lstdc++
lo que aún no obtendrá el mismo comportamiento queg++
. Ponemos todo ese comportamiento específico del idioma en su propio controlador por una razón, para eso está ahí. :-)-lstdc++
, ya que faltarán dependencias en matemática, RTTI e información de excepción. Si un caso de prueba determinado se vincula o falla, dependerá del sistema operativo y de las características de C ++ utilizadas por el caso de prueba, razón por la cual todo ese conocimiento está integrado en el controlador de g ++ en lugar de dejar que el usuario lo descubra. .gcc -lstdc++
en otros sistemas operativos, especialmente cuando el objetivo es una plataforma integrada. Afortunadamente, por eso enviamos un g ++ en primer lugar.-dumpspec
(por ejemplo) un compilador cruzado dirigido a un sistema incrustado, verá las diferencias. Hay más que solo diferencias de enlazador ... que de nuevo, de eso se trataba su respuesta (macros de preprocesador, incluyen rutas, múltiples bibliotecas de tiempo de ejecución). Parece que estamos hablando unos de otros, pero como antiguo mantenedor de GCC, le aseguro que estoy familiarizado con cuáles son y cuáles no son las interfaces.Para c ++ deberías usar g ++.
Es el mismo compilador (por ejemplo, la colección del compilador GNU). GCC o G ++ simplemente elija un front-end diferente con diferentes opciones predeterminadas.
En pocas palabras: si usa g ++, el frontend le dirá al enlazador que es posible que desee enlazar con las bibliotecas estándar de C ++. El frontend de gcc no hará eso (también podría vincularse con ellos si pasa las opciones de línea de comando correctas).
fuente
¿Cuál es la diferencia entre
g++
ygcc
?gcc
ha evolucionado de un solo lenguaje "GNU C Compiler" a una "Colección de compiladores GNU" en varios idiomas. El término "compilador GNU C" todavía se usa a veces en el contexto de la programación C.El
g++
es el compilador de C ++ para la colección de compiladores GNU. Me gustagnat
es el compilador Ada paragcc
. ver Uso de la colección del compilador GNU (GCC)Por ejemplo, el
man g++
comando Ubuntu 16.04 y 18.04 devuelve laGCC(1)
página del manual.Ubuntu 16.04 y 18.04
man gcc
establece que ...y que por defecto ...
Busque en las
gcc
páginas del manual para obtener más detalles sobre las variaciones de opciones entregcc
yg++
.¿Cuál debería usarse para el desarrollo general de c ++?
Técnicamente,
gcc
og++
se puede usar para el desarrollo general de C ++ con la configuración de opciones aplicable. Sin embargo, elg++
comportamiento predeterminado está naturalmente alineado con un desarrollo de C ++.La página de manual de Ubuntu 18.04 agregó el siguiente párrafo:
fuente
Una diferencia notable es que si pasa un
.c
archivo a gcc, se compilará como C.El comportamiento predeterminado de g ++ es tratar los
.c
archivos como C ++ (a menos que-x c
se especifique).fuente
Aunque los comandos gcc y g ++ hacen cosas muy similares, g ++ está diseñado para ser el comando que invocaría para compilar un programa C ++; está destinado a hacer automáticamente lo correcto.
Detrás de escena, son realmente el mismo programa. Según tengo entendido, ambos deciden si compilar un programa como C o como C ++ en función de la extensión del nombre de archivo. Ambos son capaces de vincularse con la biblioteca estándar de C ++, pero solo g ++ lo hace de manera predeterminada. Entonces, si tiene un programa escrito en C ++ que no necesita vincularse con la biblioteca estándar, gcc hará lo correcto; pero entonces, también lo haría g ++. Entonces, realmente no hay razón para no usar g ++ para el desarrollo general de C ++.
fuente
Me interesé en el tema y realicé algunos experimentos.
Encontré esa descripción aquí , pero es muy corta.
Luego intenté experimentar con gcc.exe y g ++. Exe en mi máquina Windows:
Traté de compilar archivos de prueba simples c89, c99 y c ++ 1998 y funciona bien para mí con las extensiones correctas que coinciden con el idioma
Pero cuando intento ejecutar la herramienta "colección compilador gnu" de esa manera:
Pero este todavía funciona sin errores.
Y esto tambien
ps Archivos de prueba
Recomendaciones:
Si mira el árbol de procesos, entonces parece que gcc y g ++ son backend para otras herramientas, que en mi entorno son: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc funciona bien como metatool para si tiene la extensión correcta o establece los indicadores -std -x correctos. Ver esto
fuente
"GCC" es un término abreviado común para la colección del compilador GNU. Este es el nombre más general para el compilador, y el nombre utilizado cuando se hace hincapié en compilar programas en C (ya que la abreviatura significaba "Compilador C GNU").
Cuando se hace referencia a la compilación de C ++, es habitual llamar al compilador "G ++". Como solo hay un compilador, también es preciso llamarlo "GCC" sin importar el contexto del lenguaje; sin embargo, el término "G ++" es más útil cuando el énfasis está en compilar programas C ++.
Podrías leer más aquí .
fuente
Estaba probando gcc y g ++ en un sistema Linux. Al usar MAKEFILE, puedo definir el compilador utilizado por "GNU make". Probé con la llamada función de localización de "memoria dinámica" de "C plus plus":
Solo g ++ puede compilarse correctamente en mi computadora, mientras que gcc informará un error
Por lo tanto, mi propia conclusión es que gcc no es totalmente compatible con "C plus plus". Parece que elegir g ++ para archivos fuente C ++ es una mejor opción.
fuente
gcc y g ++ son compiladores de GNU. Ambos compilan c y c ++. La diferencia es para los archivos * .c gcc lo trata como un programa de ca, y g ++ lo ve como un programa de ac ++. Los archivos * .cpp se consideran programas c ++. c ++ es un superconjunto de c y la sintaxis es más estricta, así que tenga cuidado con el sufijo.
fuente
g++
también se interpretará.cc
como una extensión de nombre de archivo solo en C ++.