Vyvolání GCC jako "cc" versus "gcc"

hlasů
66

Jsem si vědom toho, že na většině systémů GNU / Linux GCC lze vyvolat pod označením „CC“ z příkazového řádku (na rozdíl od „gcc“). Je nějaký rozdíl v chování GCC, když je vyvolána na jednu stranu proti druhé?

Například, já vím, že vyvolání GCC přes jméno „g ++“ namísto „gcc“ způsobí, že GCC chovají odlišně (zachází .c souborů jako C ++ zdroje a odkazy, ve standardní knihovny C ++). Je nějaký podobný rozdíl v chování mezi „gcc“ versus „cc“?

EDIT: Žádná z odpovědí doposud přijatých dal definitivní „ano“ nebo „ne“, zda GCC bude chovat jinak, kdyby použil na jednu stranu oproti druhé. Nicméně, myšlenka dána ponořit do zdroje zkontrolovat jeho chování mě vedou po této cestě. Založený na tom, co jsem tam našel, nyní se domnívám, že odpověď zní:

Ne GCC se chová stejně, bez ohledu na to, zda se nazývá přes „gcc“ nebo „CC“ .

Položena 02/06/2009 v 15:49
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
34

Pro úšklebky, jen jsem vysledovat, jak argv[0]se používá v rámci GCC ( main.c-> top_lev.c-> opts.c-> langhooks.c) a zdá se, že argv[0]je v současné době používá pro nic víc, než aby mallocněco hlásit, když selže. Nezdá se, že by změna chování, pokud argv[0]je něco jiného než gcc.

Odpovězeno 02/06/2009 v 16:41
zdroj uživatelem

hlasů
14

Zdá se mi, že cc(odkaz na nějaké staré specifikaci SUS) má být prodávající neutrální rozhraní kompilátor systému. Je označen jako dědictví:

Nástroj c89 poskytuje rozhraní k normě ISO C, ale cc nástroj přijímá nespecifikované dialekt jazyka C: může být Standard C, common-využití C nebo nějaká jiná varianta. Přenosné C programy by měly být zapsány do souladu s normou ISO C a sestavil s C89.

POSIX má nástroj s názvem c99, který je podle mého názoru nástupce c89. Říká

Nástroj C99 je založen na nástroji C89 původně zavedeného do ISO POSIX-2: normy 1993. Některé změny od C89 zahrnovat úpravy k obsahu sekce standardních knihoven s cílem zohlednit nové záhlaví a opcí; například přidán do -l rt operand a -l stopa operand přidány pro vysledování funkce.

Nejsem obeznámen se všemi těmi různými normami, ale vypadá to, že novějších SUSv3 ( POSIX: 2004 ) a ještě novější POSIX: 2008 (Nezdá se, že mají řadu SUS zatím) nezadáte utility volal ccuž, ale pouze nástroj nazvaný c99. Mimochodem, můj systém Linux ( Arch_Linux ) obsahuje manuálové stránce c99, ale ne c89, ale pouze obsahuje nástroj s názvem cc, ale ani c89ani c99. Hodně zmatek tam :)

Odpovězeno 02/06/2009 v 16:07
zdroj uživatelem

hlasů
12

Na můj mac od man gcc:

V Apple verze GCC, a to jak cc a gcc jsou vlastně symbolické odkazy na překladače pojmenované jako gcc-verzi. Podobně, c ++ a g ++ jsou odkazy na kompilátoru s názvem jako g ++ - verze.

Na základě toho bych se předpokládat, že cc a gcc chovat stejným způsobem.

Odpovězeno 02/06/2009 v 15:55
zdroj uživatelem

hlasů
8

Měl jsem stejný pochyb o tom dnes a snažil jsem se najít na vlastní pěst:

$ 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

Takže v podstatě ccpoukazuje na gcc.

Dalo by se také zkontrolovat pomocí cc -va gcc -v. Kdyby vytisknout totéž, to znamená, že jsou naprosto stejné.

Odpovězeno 28/02/2010 v 13:18
zdroj uživatelem

hlasů
7

Dokonce i když gcc provozuje stejný nezávisle na argv [0] 's hodnotou, ne všechny software bude fungovat stejný bez ohledu na to, které určíte jako kompilátor.

Při stavbě zlib 1.2.5 na RHEL 5.5 (gcc 4.1.2):

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

Ale:

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

A:

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

Skript configure nepovažuje možnost, že cc na systému Linux by mohl být gcc. Takže buďte opatrní, jak daleko budete mít vaše předpoklady.

Odpovězeno 17/12/2010 v 17:25
zdroj uživatelem

hlasů
3

toto vlákno může být starý, ale chci přidat něco k tomu (možná někdo najdete ji v budoucnu).

Pokud jste sestavil tento program

#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;
}

s „gcc“ a předat „AAAAAAAAAAAAAAAAAAAAAAAAA“ jako argumentem, že nebude přetečení do buffer2, zatímco to dělá, když se sestavují s „cc“, což pro mě je náznak, že pokud jste použili „gcc“, správa paměti pracuje jiný, možná tím, že prostor mezi paměťovými segmenty polí buff1 & buff2?

Možná, že někdo s větším experiance může dát světlo do temnoty zde.

Odpovězeno 18/06/2015 v 17:28
zdroj uživatelem

hlasů
3

cc je jen UNIX způsob volání kompilátor, bude to fungovat na všech Unixech.

Odpovězeno 02/06/2009 v 16:15
zdroj uživatelem

hlasů
2

„Ne GCC chová stejné bez ohledu na to, zda je vyvolána prostřednictvím‚GCC‘nebo‚CC‘.“

[Citace z původní místo.]

Na mé zkušenosti v Ubuntu 14.04 bázi, ale toto nebyl případ.

Když jsem se sestavit svůj program pomocí:

gcc -finstrument-functions test.c

Nechápu žádnou změnu v chování mého kódu. Ale když jsem se sestavit s použitím

cc -finstrument-functions test.c

To se chovají odlišně. (V obou případech začleněno I příslušné změny do mého kódu je popsáno zde , aby se -finstrument-funkce pracují).

Odpovězeno 09/09/2014 v 19:35
zdroj uživatelem

hlasů
2

Nic v dokumentaci GCC znamená, že GCC by se chovat jinak, než-li její název spustitelného není gcc ale cc . GNU Fortran kompilátor dokonce uvádí, že :

Verze gcc příkazu (které také mohou být instalovány jako příkaz cc systému)

Odpovězeno 02/06/2009 v 16:18
zdroj uživatelem

hlasů
1

Pro můj OS (Ubuntu 14.04) ccneumožňuje dokončení kartu, zatímco gccdělá.

Odpovězeno 30/03/2016 v 14:45
zdroj uživatelem

hlasů
1

Vzhledem k tomu, to přichází z UNIX, řekl bych, že „cc“ je obecný název a „gcc“ je skutečný kompilátor. ie „gcc“ poskytuje „CC“, takže je použit program hledá „cc“ by se najít a použít „CC“, blažené nevědomosti o skutečném kompilátoru.

Také programy UNIX by měl být neznalý skutečný název používaný nazývat (myslím zkratky Windows Desktop - to nedává smysl, aby zkontrolovat, co zástupce byl nazýván), tak ne, „gcc“ a „cc“ proveďte totéž, pokud „cc“ je odkaz na „gcc“.

Není-li, samozřejmě, „cc“ není symlink ale shellscript volat gcc.

Odpovězeno 02/06/2009 v 16:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more