¿Cuál es la diferencia entre g ++ y gcc? ¿Cuál de ellos debería usarse para el desarrollo general de c ++?
¿Cuál es la diferencia entre g ++ y gcc? ¿Cuál de ellos debería usarse para el desarrollo general de c ++?
Respuestas:
gcc
y 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 -v
opción (muestra los comandos de la cadena de herramientas del backend que se están ejecutando).
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
: Compilador
g++
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
y g++
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
gcc
pasando el -lstdc++
parámetro.
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í. :-)
-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).
¿Cuál es la diferencia entre g++
y gcc
?
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 gusta gnat
es 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 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 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 gcc
páginas del 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++
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
, omachine-gcc
cuando se realiza una compilación cruzada, omachine-gcc-version
ejecutar una versión específica de GCC. Cuando compila programas C ++, debe invocar GCC como en sug++
lugar.
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).
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 ++.
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:
$ 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
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
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]
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 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 ++.
Podrías leer más aquí .
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.
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.
g++
también se interpretará .cc
como una extensión de nombre de archivo solo en C ++.