2009-06-02 8 views
63

Soy consciente de que en la mayoría de los sistemas GNU/Linux, GCC puede invocarse con el nombre "cc" desde la línea de comandos (en lugar de "gcc"). ¿Hay alguna diferencia en el comportamiento de GCC cuando se invoca de una manera contra la otra?Invocando a GCC como "cc" frente a "gcc"

Por ejemplo, sé que invocar GCC con el nombre "g ++" en lugar de "gcc" hace que GCC se comporte de manera diferente (trata los archivos .c como fuente C++ y enlaces en la biblioteca estándar de C++). ¿Hay alguna diferencia similar en el comportamiento entre "gcc" versus "cc"?

EDIT: Ninguna de las respuestas recibidas hasta ahora dio un definitivo "sí" o "no" en cuanto a si GCC se comportará de manera diferente si se invoca una manera frente a la otra. Sin embargo, la idea de sumergirse en la fuente para verificar su comportamiento me lleva por ese camino. En base a lo que encontré allí, ahora creo que la respuesta es:

No. GCC se comporta igual independientemente de si se llama a través de "gcc" o "cc".

+0

Parece ser lo mismo aa gawk vs awk, gmake vs make etc. Me vendería en ellos siendo igual siempre. En los sistemas solares, escuché que make es diferente de gmake (gnu make). Quizás en algún sistema se aplican cosas similares para gcc vs cc. –

Respuesta

33

para las muecas, acabo rastreada cómo argv[0] se utiliza desde dentro gcc (main.c ->top_lev.c ->opts.c ->langhooks.c) y parece que argv[0] se utiliza actualmente para nada más que dar malloc algo que informar cuando falla. No parece haber ningún cambio de comportamiento si argv[0] es distinto de gcc.

+2

El único problema que tengo con eso es que "cc --version" da * levemente * salida diferente de "gcc --version" (dice "cc" en lugar de "gcc"). Entonces * algo * allí debe estar mirando a argv [0]. –

+13

Tu respuesta me motivó a buscar el código fuente yo mismo. Descubrí que argv [0] sí se asigna a "nombre de programa", que termina pasándose un poco a otras funciones (y se almacena en el entorno). Aunque no realicé una búsqueda * exhaustiva *, por lo que puedo ver, solo se usa para fines de visualización (por ejemplo, en la salida "--version", salida de "uso", mensajes de error, etc.). –

+0

Acabo de darme cuenta de que esto es cierto solo si cc y gcc son el mismo ejecutable. ¿Puede suceder que el sistema tenga binarios diferentes? Imagine que cc puede vincular a un clang binary y gcc a gcc. Pregunta honesta, no tengo idea. –

12

en mi Mac de man gcc:

En la versión de Apple de GCC, tanto cc y gcc en realidad son enlaces simbólicos a un compilador nombrado como gcc-version. Del mismo modo, C++ y g ++ son enlaces a un compilador llamado como g ++ - versión.

En base a eso, supongo que cc y gcc se comportan de la misma manera.

+17

es común en el mundo de Unix establecer varios enlaces al mismo ejecutable, y cambia algunos valores predeterminados de acuerdo con el nombre que se utilizó cuando se llama. – Javier

+0

woah y un voto negativo sin explicación - muy útil ... ¿tal vez no les gustó nada? – stefanB

+3

quizás un enemigo de Apple? :) –

1

Considerando que esto viene de UNIX, diría que "cc" es el nombre genérico y "gcc" es el compilador real. es decir, "gcc" proporciona "cc" para que un programa que busca "cc" encuentre y utilice "cc", felizmente ignorante del compilador real que se está utilizando.

Además, los programas de UNIX deben ignorar el nombre real utilizado para llamarlos (piense en los accesos directos de Windows Desktop - no tiene sentido comprobar cómo se llamaba el atajo), entonces, no, "gcc" y " cc "haga lo mismo si" cc "es un enlace a" gcc ".

A menos que, por supuesto, "cc" no sea un enlace simbólico sino un shellscript que llame a gcc.

+2

gzip comprueba su nombre. Si su nombre es gunzip, supone -d. – Joshua

+3

"Además, los programas de UNIX deben ignorar el nombre real utilizado para llamarlos" No es absolutamente cierto. ¿Alguna vez has oído hablar de los binarios de llamadas múltiples? Es decir. ¿Busybox? http://www.busybox.net/ – mateusza

+2

y, después de todo, "sh" suele ser un enlace simbólico a "bash", lo que lo hace comportarse como un shell POSIX. sh <-> bash es en realidad muy similar a cc <-> gcc. –

14

Me parece que cc (enlace a alguna antigua especificación SUS) pretende ser la interfaz neutral del proveedor para el compilador del sistema. Está marcado como legado:

La utilidad C89 proporciona una interfaz para el estándar ISO C, pero la utilidad cc acepta un dialecto no especificada del lenguaje C: puede ser estándar C, común en el uso C o alguna otra variante . Los programas portátiles C deben escribirse para cumplir con el estándar ISO C y compilarse con c89.

POSIX tiene una utilidad llamada c99 que creo que es el sucesor de c89. Dice

La utilidad c99 se basa en la utilidad c89 presentada originalmente en el estándar ISO POSIX-2: 1993. Algunos de los cambios de c89 incluyen la modificación de los contenidos de la sección Bibliotecas estándar para tener en cuenta nuevos encabezados y opciones; por ejemplo, agregado al operando -l rt, y el operando de rastreo -l agregado para las funciones de rastreo.

No estoy muy familiarizado con todas esas diferentes normas, pero parece que la más reciente SUSv3 (POSIX:2004) y el aún más reciente POSIX:2008 (no parece tener un número SUS todavía) no especifican una utilidad llamada cc, pero solo la utilidad llamada c99. Por cierto, mi sistema Linux (Arch_Linux) contiene una página de manual de c99 pero no c89, pero solo contiene una utilidad llamada cc, pero ni c89 ni c99. Mucha confusión allí :)

+1

Enlace de interés. Alguien probablemente debería decirle a GNU. Hacer que las personas lo hagan, porque aún invocará "cc" como el valor predeterminado si no anulas $ {CC}. Aparentemente deberían usar una de las otras utilidades como predeterminado. Parecería que c89 * debería * ser la utilidad preferida según el estándar. –

+1

OTOH, ya que fue escrito en 1997, tal vez en estos días la utilidad preferida debería ser c99. –

+1

sí, SUSv3 ya no incluye c89. solo el anterior al que lo vinculé lo recomendó (SUSv2) –

3

cc es solo la forma UNIX de llamar al compilador, funcionará en todos los Unices.

+2

Esto no resuelve la pregunta. – bortzmeyer

+3

En realidad lo hace, cc significa "compilador de C" en Unix, nada más. – ismail

+1

El interlocutor también le preguntó acerca de la diferencia de cc y gcc. Esto también sirve como respuesta y responde a la pregunta, imo –

2

Nada en la documentación de GCC GCC indica que se comportaría de forma diferente si su nombre ejecutable no es gcc pero cc. El compilador GNU Fortran incluso mentions that:

Una versión del comando gcc (que también podría ser instalado como comando de cc del sistema)

2

He estado usando UNIX desde 1983, y el compilador de C en aquel entonces se llamaba cc. Es bueno pensar que tal vez un makefile que escribí en aquel entonces todavía podía trabajar en la última distribución de Linux hoy ...

+1

Bueno, la razón por la que esto surgió es porque GNU Make predetermina la variable $ {CC} para simplemente "cc" en lugar de "gcc" (por razones históricas, estoy seguro). Entonces, si usa las reglas incorporadas predeterminadas de GNU Make, se compilará usando "cc". Me preguntaba si hay alguna diferencia si reasigno $ {CC} a "gcc" en lugar de dejarlo solo. –

+1

Solo debe cambiarlo si usa las características específicas de GCC de esa manera, no podrá compilarse directamente en máquinas sin GCC. –

8

que tenían la misma duda hoy y tratado de encontrar por mi cuenta:

$ which cc 
/usr/bin/ccc 

$file /usr/bin/cc 
/usr/bin/cc: symbolic link to '/etc/alternatives/cc' 

$file /etc/alternatives/cc 
/etc/alternatives/cc: symbolic link to '/usr/bin/gcc' 

$which gcc 
/usr/bin/gcc 

Por lo tanto, básicamente cc apunta a gcc.

También puede marcar usando cc -v y gcc -v. Si imprimen lo mismo, eso significa que son exactamente iguales.

+4

Tenga en cuenta el comentario que Javier dio a la respuesta de stefanB: Unix proporciona el "nombre del programa" a un programa como el 0º argumento de línea de comandos, y muchos programas en Unix están configurados con enlaces simbólicos de muchos nombres diferentes y cambiar su comportamiento dependiendo de qué nombre se utilizó para llamarlos. (Por ejemplo, gunzip es un enlace a gzip, pero si llamas a gzip, comprime las cosas y si llamas gunzip las descomprime.) Por lo tanto, es totalmente plausible que GCC actúe de manera diferente si lo ejecutas a través de un enlace simbólico llamado 'cc' . –

7

Incluso si gcc opera de la misma manera independiente del valor de argv [0], no todo el software funcionará igual independientemente de lo que especifique como compilador.

Cuando la construcción de zlib 1.2.5 en RHEL 5.5 (gcc 4.1.2):

$ md5sum $(which cc) 
69a67d3029b8ad50d41abab8d778e799 /usr/bin/cc 
$ md5sum $(which gcc) 
69a67d3029b8ad50d41abab8d778e799 /usr/bin/gcc 

Pero:

$ CC=$(which cc) ./configure 
Checking for shared library support... 
Tested /usr/bin/cc -w -c -O ztest20557.c 
Tested cc -shared -O -o ztest20557.so ztest20557.o 
/usr/bin/ld: ztest20557.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC 
ztest20557.o: could not read symbols: Bad value 
collect2: ld returned 1 exit status 
No shared library support; try without defining CC and CFLAGS 
Building static library libz.a version 1.2.5 with /usr/bin/cc. 
Checking for off64_t... Yes. 
Checking for fseeko... Yes. 
Checking for unistd.h... Yes. 
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf(). 
Checking for vsnprintf() in stdio.h... Yes. 
Checking for return value of vsnprintf()... Yes. 

Y:

$ CC=$(which gcc) ./configure 
Checking for shared library support... 
Building shared library libz.so.1.2.5 with /usr/bin/gcc. 
Checking for off64_t... Yes. 
Checking for fseeko... Yes. 
Checking for unistd.h... Yes. 
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf(). 
Checking for vsnprintf() in stdio.h... Yes. 
Checking for return value of vsnprintf()... Yes. 
Checking for attribute(visibility) support... Yes. 

El script de configuración no lo hace considere la posibilidad de que cc en un sistema Linux pueda ser gcc. Por lo tanto, tenga cuidado de cuán lejos toma sus suposiciones.

+2

Esto es evidente. El compilador no se comporta de manera diferente. Este es un defecto del script 'configure'. El script sabe que 'gcc' puede generar bibliotecas compartidas y sabe que' gcc' necesita la opción '-fPIC' cuando compila bibliotecas compartidas en Linux. Si el compilador no es 'gcc', entonces' configure' intenta probar si el compilador puede generar bibliotecas compartidas. ** Pero ** no puede adivinar qué banderas del compilador son necesarias para un compilador que no conoce, por lo que el usuario debe proporcionarlas. Debe proporcionar los indicadores necesarios en la línea de comando (por ejemplo, a través de 'CFLAGS = -fPIC'). –

+3

Esto fue pensado como una precaución auxiliar en lugar de una respuesta. Invocar gcc como cc en el caso anterior no haría que funcionara de manera diferente, pero el software invocador funcionaba de una manera no intuitiva que causaba la aparición de un comportamiento diferente. – ednos

2

"No.GCC se comporta de la misma, independientemente de si se llama a través de 'gcc' o 'CC'."

[Citado de post original.]

Con base en mi experiencia en Ubuntu 14.04, esto no tiene ha sido el caso

cuando puedo compilar mi programa usando:..

gcc -finstrument-functions test.c 

que no reciben ningún cambio en el comportamiento de mi código, pero cuando compilo usando

cc -finstrument-functions test.c 

Se comporta de manera diferente. (En ambos casos, incorporé los cambios apropiados en mi código descrito here para hacer funcionar las funciones -finstrument-functions).

3

este hilo puede ser antiguo pero quiero agregarle algo (tal vez alguien lo encuentre en el futuro).

Si compiló este programa

#include <stdio.h> 
#include <stdlib.h> 

void 
myFunction(char *args) 
{ 
    char buff1[12]; 
    char buff2[4] = "ABC"; 

    strcpy(buff1,args); 

    printf("Inhalt Buffer2: %s",buff2); 

} 

int main(int argc, char *argv[]) 
{ 

    if(argc > 1) 
    { 
     myFunction(argv[1]); 
    } 
    else 
     printf("no arguments sir daimler benz"); 

    getchar(); 

    return 0; 
} 

con "gcc", y se le pasa "AAAAAAAAAAAAAAAAAAAAAAAAA" como argumento, no lo hará desbordamiento en tampón 2, mientras que lo hace cuando se ha compilado con "cc", que para mí es una pista de que si usaste "gcc", la gestión de memoria funciona de manera diferente, tal vez poniendo espacio entre los segmentos de memoria de los campos buff1 & buff2?

Tal vez alguien con más experiencia pueda iluminar la oscuridad aquí.

+1

Intenté esto (en la versión 4.8.4 de gcc (Ubuntu 4.8.4-2ubuntu1 ~ 14.04)), con el protector de pila apagado y encendido y ambos terminan con ** error de segmentación ** o ** aplastamiento de pila detectado **, en el extremo cc es un enlace a/etc/alternatives/cc y ese es un enlace a/usr/bin/gcc. Como @abcoep dice que cc y gcc difieren solo con la finalización de pestañas (por lo que pude investigar). – Kyslik

1

Para mi sistema operativo (Ubuntu 14.04) cc no permite la terminación de pestañas, mientras que gcc lo hace.

Cuestiones relacionadas