c++ - con - ¿Cuál es la diferencia entre g++ y gcc?
gcc linux install (10)
"GCC" es un término abreviado común para la colección de compiladores GNU. Este es el nombre más general para el compilador y el nombre que se usa cuando se hace hincapié en compilar programas en C (como la abreviatura anteriormente significaba "Compilador GNU C").
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 idioma; sin embargo, el término "G ++" es más útil cuando el énfasis está en compilar programas en C ++.
Podrías leer más here .
¿Cuál es la diferencia entre g ++ y gcc? ¿Cuáles deberían usarse para el desarrollo general de c ++?
Aunque los comandos gcc y g ++ hacen cosas muy similares, g ++ está diseñado para ser el comando que invocarías para compilar un programa en C ++; Se pretende hacer automáticamente lo correcto.
Detrás de las escenas, son realmente el mismo programa. Según tengo entendido, ambos deciden si compilar un programa como C o como C ++ según la extensión del nombre de archivo. Ambos son capaces de vincularse con la biblioteca estándar de C ++, pero solo g ++ hace esto de forma 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 ++. Así que realmente no hay razón para no usar g ++ para el desarrollo general de C ++.
Estaba probando gcc y g ++ en un sistema linux. Al usar MAKEFILE, puedo definir el compilador usado por "GNU make". Probé con la función de localización llamada "memoria dinámica" de "C plus plus" mediante:
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i/n",*myptr);
return 0;
}
Solo g ++ puede compilar exitosamente en mi computadora mientras gcc reportará un error
undefined reference to `operator new(unsigned long)''
Así que mi propia conclusión es que gcc no es totalmente compatible con "C plus plus". Parece que elegir g ++ para archivos fuente de C ++ es una mejor opción.
GCC: Colección de compiladores de GNU
- Se refiere a todos los diferentes idiomas que son compatibles con el compilador GNU.
gcc: compilador GNU C
g ++: Compilador GNU C ++
Las principales diferencias:
- gcc compilará: * .c / *. cpp como C y C ++ respectivamente.
- g ++ compilará: * .c / *. cpp archivos, pero todos serán tratados como archivos C ++.
- Además, si usa g ++ para vincular los archivos de objetos, se vinculará automáticamente en las bibliotecas estándar de C ++ (gcc no hace esto).
- gcc compilando archivos C tiene menos macros predefinidas.
- La compilación de gcc * .cpp y la compilación de g ++ * .c / *. cpp tienen algunas macros adicionales.
Macros adicionales al compilar archivos * .cpp:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
La única diferencia notable es que si pasas un .c
a gcc, se compilará como C, mientras que g ++ siempre lo tratará como C ++.
Para c ++ debes usar g ++.
Es el mismo compilador (por ejemplo, la colección de compiladores GNU). GCC o G ++ simplemente eligen un front-end diferente con diferentes opciones predeterminadas.
En pocas palabras: si usa g ++, el frontend le dirá al vinculador que es posible que desee enlazar con las bibliotecas estándar de C ++. La interfaz de gcc no lo hará (también podría vincularse con ellos si pasas las opciones correctas de la línea de comando).
gcc y g ++ son ambos compiladores GNU. Ambos compilan c y c ++. La diferencia es que 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 super conjunto de c y la sintaxis es más estricta, así que tenga cuidado con el sufijo.
gcc
y g++
son controladores de compilación de la colección de compiladores de GNU (que alguna vez fue solo el compilador de C de GNU).
A pesar de que determinan automáticamente a qué backends ( cc1
cc1plus
...) llamar según el tipo de archivo, a menos que se invalide con el -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 equivalente a gcc -xc++ -lstdc++ -shared-libgcc
(la primera es una opción de compilador, la segunda es una opción de vinculador). Esto puede comprobarse ejecutando ambos con la opción -v
(muestra los comandos de la cadena de herramientas backend que se están ejecutando).
¿Cuál es la diferencia entre g++
y gcc
?
gcc
ha evolucionado desde un solo lenguaje "GNU C Compiler" hasta convertirse en 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 en C.
El g++
es el compilador de C ++ para la colección de compiladores de GNU. Como gnat
es el compilador de Ada para gcc
. ver Uso de la colección de compiladores de GNU (GCC)
Por ejemplo, el comando man g++
Ubuntu 16.04 y 18.04 devuelve la página de manual GCC(1)
.
El Ubuntu 16.04 y 18.04 man gcc
afirma que ...
g++
acepta en su mayoría las mismas opciones quegcc
y que el por defecto ...
... el uso de
gcc
no agrega la biblioteca de 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 y .i como archivos fuente C ++ en lugar de archivos fuente C a menos que se use -x. Este programa también es útil cuando se precompila un archivo de encabezado C con una extensión .h para su uso en compilaciones de C ++.
Busque en las páginas de manual de gcc
para obtener más información sobre las variaciones de opciones de gcc
y g++
.
¿Cuál debería usarse para el desarrollo general de c ++?
Técnicamente, gcc
o g++
se pueden usar para el desarrollo general de C ++ con la configuración de opción aplicable. Sin embargo, el comportamiento predeterminado de g++
está naturalmente alineado con un desarrollo de C ++.
La página del manual de Ubuntu 18.04 agregó el siguiente párrafo:
La forma habitual de ejecutar GCC es ejecutar el ejecutable llamado
gcc
, omachine-gcc
cuando se realiza una compilación cruzada, omachine-gcc-version
para ejecutar una versión específica de GCC. Cuando compila programas de C ++, debe invocar GCC comog++
lugar.
Me interesé en el tema y realicé algunos experimentos.
Encontré esa descripción here , pero es muy corta.
Luego intenté experimentar con gcc.exe y g ++. Exe en mi máquina con 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
Intenté compilar archivos de prueba simples c89, c99 y c ++ 1998 y me funciona bien 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
Pero cuando intento ejecutar la herramienta "gnu compiler collection" 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]
Pero este todavía funciona sin errores.
$ gcc -x c++ -std=c++98 test_cpp.c
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:
Si observa el árbol de procesos, parece que gcc, y g ++ están en el backend de otras herramientas, que en mi entorno son: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc funciona bien como metatool si tiene la extensión correcta o si establece los indicadores -std -x correctos. Ver this