parametros ejecutar compiler compilar compilador c++ c gcc

c++ - ejecutar - Diferencia entre CC, gcc y g++?



gcc linux (2)

¿Cuál es la diferencia entre los 3 compiladores CC, gcc, g ++ al compilar el código C y C ++ en términos de generación de código ensamblador, bibliotecas disponibles, características de idioma, etc.?


La respuesta a esto es específica de la plataforma; lo que sucede en Linux es diferente de lo que sucede en Solaris, por ejemplo.

La parte fácil (porque no es específica de la plataforma) es la separación de ''gcc'' y ''g ++'':

  • gcc es el compilador GNU C del GCC (Colección compilador GNU).
  • g ++ es el compilador GNU C ++ del GCC.

La parte difícil, porque es específica de la plataforma, es el significado de ''CC'' (y ''cc'').

  • En Solaris, CC es normalmente el nombre del compilador Sun C ++.
  • En Solaris, cc es normalmente el nombre del compilador de Sun C.
  • En Linux, si existe, CC es probablemente un enlace a g ++.
  • En Linux, cc es un enlace a gcc.

Sin embargo, incluso en Solaris, podría ser que cc es el viejo compilador de C basado en BSD de /usr/ucb . En la práctica, generalmente no está instalado y solo falla un trozo, lo que causa estragos en aquellos que intentan compilar e instalar software autoconfigurado.

En HP-UX, el ''cc'' predeterminado sigue siendo un compilador de C exclusivo de K & R instalado para permitir el reenlazado del kernel cuando sea necesario e inutilizable para el trabajo de software moderno porque no es compatible con el estándar C. Debe usar nombres de compilador alternativos (''acc'' IIRC). De forma similar, en AIX, el compilador del sistema C tiene nombres como ''xlc'' o ''xlc32''.

Clásicamente, el compilador del sistema predeterminado se llamaba ''cc'' y el software de autoconfiguración recurre a ese nombre cuando no sabe qué más usar.

POSIX intentó legislar su camino al respecto al exigir que existan los programas c89 (originalmente) y más tarde c99; estos son los compiladores compatibles con los estándares ISO / IEC 9899: 1989 y 9899: 1999 C. Es dudoso que POSIX haya tenido éxito.

La pregunta se refiere a las diferencias en términos de características y bibliotecas. Como antes, la respuesta es específica de la plataforma en parte, y genérica en parte.

La gran división es entre los compiladores de C y los compiladores de C ++. Los compiladores C ++ aceptarán programas C ++ y no compilarán programas C arbitrarios. (Aunque es posible escribir C en un subconjunto que C ++ también entiende, muchos programas C no son programas C ++ válidos). De forma similar, los compiladores C aceptarán programas C y rechazarán la mayoría de los programas C ++ (porque la mayoría de los programas C ++ usan construcciones no disponibles en C).

El conjunto de bibliotecas disponibles para su uso depende del idioma. Los programas C ++ generalmente pueden usar bibliotecas C en una plataforma determinada; Los programas C usualmente no pueden usar librerías C ++. Entonces, C ++ tiene un conjunto más grande de bibliotecas disponibles.

Tenga en cuenta que si está en Solaris, el código de objeto producido por CC no es compatible con el código de objeto producido por g ++; son dos compiladores separados con convenciones separadas para cosas como el manejo de excepciones y la creación de nombres (y el nombre de manipulación deliberadamente ¡diferente para asegurar que los archivos de objetos incompatibles no estén vinculados entre sí!). Esto significa que si desea utilizar una biblioteca compilada con CC, debe compilar todo su programa con CC. También significa que si desea usar una biblioteca compilada con CC y otra compilada con g ++, no tiene suerte. Tienes que recompilar una de las bibliotecas al menos.

En términos de calidad de ensamblador generado, GCC (GNU Compiler Collection) hace un muy buen trabajo. Pero a veces los compiladores nativos funcionan un poco mejor. Los compiladores de Intel tienen optimizaciones más amplias que aún no se han replicado en GCC, creo. Pero cualquiera de estas pontificaciones es peligrosa, mientras que no sabemos qué plataforma le preocupa.

En términos de características de lenguaje, todos los compiladores generalmente alcanzan niveles bastante cercanos a los estándares actuales (C ++ 98, C ++ 2003, C99), pero generalmente existen pequeñas diferencias entre el lenguaje estándar y el lenguaje admitido por el compilador. El antiguo soporte estándar C89 es esencialmente el mismo (y completo) para todos los compiladores de C. Hay diferencias en los rincones más oscuros del lenguaje. Debe comprender "comportamiento indefinido", "comportamiento definido por el sistema" y "comportamiento no especificado"; si invoca un comportamiento indefinido, obtendrá diferentes resultados en diferentes momentos. También hay muchas opciones (especialmente con el GCC) para ajustar el comportamiento del compilador. El GCC tiene una variedad de extensiones que simplifican la vida si usted sabe que solo está apuntando a esa familia de compiladores.


CC es una variable de entorno que hace referencia al compilador de C del sistema. Lo que señala (bibliotecas accesibles, etc.) depende de la plataforma. A menudo apuntará a /usr/bin/cc , el compilador c real (controlador). En las plataformas Linux, CC casi siempre apunta a /usr/bin/gcc .

gcc es el controlador binario para la colección de compiladores de GNU. Puede compilar C, C ++ y posiblemente otros idiomas; determina el idioma por la extensión de archivo.

g++ es un controlador binario como gcc , pero con algunas opciones especiales configuradas para compilar C ++. Notablemente (en mi experiencia), g++ vinculará libstdc ++ de forma predeterminada, mientras que gcc no lo hará.