调用GCC为“cc”与“gcc”
我知道,在大多数GNU / Linux系统上,GCC可以通过命令行(而不是“gcc”)命名为“cc”。 海湾合作委员会的行为是否与其他方式有所不同?
例如,我知道通过名称“g ++”而不是“gcc”来调用GCC会导致GCC的行为不同(在C ++标准库中将.c文件视为C ++源代码和链接)。 “gcc”和“cc”之间的行为有没有类似的区别?
编辑:到目前为止收到的答案都没有给出明确的 “是”或“否”,以确定GCC是否会以一种方式相对于另一种方式行为不同。 然而,潜入源头检查其行为的想法使我走上了这条道路。 根据我在那里find的,我现在相信答案是:
GCC的行为是一样的,不pipe它是通过“gcc”还是“cc”来调用 。
对于咧嘴笑话,我只是从gcc( main.c
– > top_lev.c
– > opts.c
– > langhooks.c
)中使用argv[0]
的方法进行langhooks.c
,看来argv[0]
而不是给malloc
什么东西报告失败。 如果argv[0]
不是gcc
以外的东西,那么似乎没有任何行为改变。
在我看来, cc
(链接到一些旧的SUS规范)旨在成为系统编译器与供应商无关的接口。 它被标记为遗产:
c89实用程序提供了ISO C标准的接口,但cc实用程序接受C语言的未指定方言:它可以是标准C,常用C或其他变体。 可移植的C程序应该写成符合ISO C标准并用c89编译。
POSIX有一个叫做c99
的工具,我相信它是c89
的inheritance者。 它说
c99实用程序基于最初在ISO POSIX-2:1993标准中引入的c89实用程序。 c89中的一些更改包括修改标准库部分的内容以考虑新的标题和选项; 例如,将其添加到-l rt操作数,并为跟踪function添加-l跟踪操作数。
我对所有这些不同的标准并不是很熟悉,但是看起来像是最近的SUSv3( POSIX:2004 )和更新的POSIX:2008 (似乎还没有SUS编号)没有指定一个实用程序称为cc
,但只有实用程序称为c99
。 顺便说一句,我的Linux系统( Arch_Linux )包含c99
的联机帮助页,但不包含c89
,但只包含一个名为cc
的实用程序,但不包含c89
和c99
。 在那里很混乱:)
在我的Mac从man gcc
:
在苹果的GCC版本中,cc和gcc实际上是象gcc-version这样的编译器的符号链接。 类似地,c ++和g ++是指向像g ++ – 版本这样的编译器的链接。
基于此,我会认为cc和gcc的行为是一样的。
我今天也有同样的疑问,我试图自己find它:
$ 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
所以,基本上cc
指向gcc
。
你也可以使用cc -v
和gcc -v
检查。 如果他们打印出同样的东西,那就意味着他们完全一样。
即使gcc独立于argv [0]的值操作,不pipe所指定的编译器是什么,并不是所有的软件都是相同的。
在RHEL 5.5(gcc 4.1.2)上构buildzlib 1.2.5时:
$ md5sum $(which cc) 69a67d3029b8ad50d41abab8d778e799 /usr/bin/cc $ md5sum $(which gcc) 69a67d3029b8ad50d41abab8d778e799 /usr/bin/gcc
但:
$ 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.
和:
$ 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.
configuration脚本不考虑在Linux系统上的cc可能是gcc的可能性。 所以,要小心你的假设。
cc只是调用编译器的UNIX方式,它可以在所有的Unices上运行。
这个线程可能会老,但我想添加一些东西(也许有人会在未来find它)。
如果你编译这个程序
#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; }
与“gcc”,你传递它“AAAAAAAAAAAAAAAAAAAAAAAAA”作为参数,它不会溢出到缓冲区2,虽然它会做,如果你编译“cc”,这对我来说是一个暗示,如果你使用“gcc”工作不同,也许通过在buff1和buff2这两个字段的内存段之间放置空间?
也许有更多体验的人可以在这里把光照在黑暗中。
如果GCC文档中的可执行文件名不是gcc,而是cc ,则GCC文档中没有任何内容表示GCC的行为不同。 GNU Fortran编译器甚至提到 :
gcc命令的一个版本(也可以作为系统的cc命令安装)
自1983年以来,我一直在使用UNIX,而当时的C编译器被称为cc
。 很高兴认为,也许我写回来的makefile仍然可以工作在最新的Linux发行版上。
“不pipe是通过”gcc“还是”cc“调用,GCC的行为都是一样的。”
[引自原帖。]
根据我在Ubuntu 14.04中的经验,事实并非如此。
当我编译我的程序使用:
gcc -finstrument-functions test.c
我的代码行为没有任何改变。 但是当我编译使用
cc -finstrument-functions test.c
它的行为有所不同。 (在这两种情况下,我将适当的更改合并到我在此处介绍的代码中以使工具function正常工作)。
考虑到这是来自UNIX,我会说“cc”是通用名称,“gcc”是实际的编译器。 即“gcc”提供了“cc”,因此寻找“cc”的程序将会find并使用“cc”,对所使用的实际编译器毫不知情。
此外,UNIX程序应该不知道用于调用它们的实际名称(认为Windows桌面快捷方式 – 检查快捷方式的调用是没有意义的),因此,不要使用“gcc”和“cc”同样的事情,如果“cc”是一个“gcc”的链接。
除非当然,“cc”不是一个符号链接,而是一个调用gcc的shell脚本。
对于我的操作系统(Ubuntu 14.04) cc
不允许tab完成,而gcc
。