¿Cuál es la diferencia entre g ++ y gcc?

875

¿Cuál es la diferencia entre g ++ y gcc? ¿Cuál de ellos debería usarse para el desarrollo general de c ++?

Brian R. Bondy
fuente
g ++ => compilador c ++ gcc => compilador c
Nagappa

Respuestas:

727

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 ( 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 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).

Kodiólogo
fuente
13
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:

  1. gcccompilará: *.c\*.cpparchivos como C y C ++ respectivamente.
  2. g++compilará: *.c\*.cpparchivos pero todos serán tratados como archivos C ++.
  3. 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).
  4. gcc compilar archivos C tiene menos macros predefinidas.
  5. gcccompilar *.cppy g++compilar *.c\*.cpparchivos tiene algunas macros adicionales.

Macros adicionales al compilar *.cpparchivos:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Martin York
fuente
37
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).

Nils Pipenbrinck
fuente
3
+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.

El g++ es el compilador de C ++ para la colección de compiladores GNU. Me gusta gnates el compilador Ada para gcc. ver Uso de la colección del compilador GNU (GCC)

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 página de manual de Ubuntu 18.04 agregó el siguiente párrafo:

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.

l --marc l
fuente
21

Una diferencia notable es que si pasa un .carchivo a gcc, se compilará como C.

El comportamiento predeterminado de g ++ es tratar los .carchivos como C ++ (a menos que -x cse especifique).

njsf
fuente
19
(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 ++.

zaphod
fuente
12

Me interesé en el tema y realicé algunos experimentos.

  1. Encontré esa descripción aquí , pero es muy corta.

  2. Luego intenté experimentar con gcc.exe y g ++. Exe en mi máquina Windows:

    $ g++ --version | head -n1 
    g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
  3. 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

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
  4. Pero cuando intento ejecutar la herramienta "colección compilador gnu" de esa manera:

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. Pero este todavía funciona sin errores.

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. Y esto tambien

    $ g++ -std=c++0x test_cpp_11.cpp 

ps Archivos de prueba

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector<int> a {1,2,3}; // bracket initialization
    return 0;
}

Recomendaciones:

  1. 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

  2. gcc funciona bien como metatool para si tiene la extensión correcta o establece los indicadores -std -x correctos. Ver esto

bruziuz
fuente
9

"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í .

Minh-Triet Pham Tran
fuente
0

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 = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

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.

magicmax
fuente
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.

Marcus Thornton
fuente
1
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 ++.
underscore_d