将GCC分别称为“ cc”和“ gcc”


70

我知道在大多数GNU / Linux系统上,可以从命令行通过名称“ cc”(而不是“ gcc”)调用GCC。一种方式与另一种方式调用时,GCC的行为是否有差异?

例如,我知道通过名称“ g ++”而不是“ gcc”调用GCC会导致GCC行为不同(它将.c文件视为C ++源代码,并在C ++标准库中链接)。“ gcc”与“ cc”之间在行为上是否有类似的区别?

编辑:到目前为止,关于GCC如果以一种方式调用还是以另一种方式调用,行为是否有所不同,到目前为止,没有一个答案给出明确的“是”或“否”。但是,提出深入研究源代码以检查其行为的想法使我沿着这条路走了。根据我在那里的发现,我现在认为答案是:

否。无论通过“ gcc”还是“ cc”调用,GCC的行为都相同


似乎是相同的aa gawk vs awk,gmake vs make等。我总是将它们等同地卖给我。在solaris系统上,我听说make与gmake(gnu make)不同。也许在某些系统上,类似的情况适用于gcc与cc。
Johannes Schaub-litb

Answers:


35

对于咧嘴笑,我只是argv[0]从gcc(main.c-> top_lev.c-> opts.c-> langhooks.c)中argv[0]查找了用法,看来它目前仅用于malloc在失败时提供报告。如果没有出现任何改变行为argv[0]比其他任何东西gcc


3
我唯一的问题是“ cc --version”与“ gcc --version”给出的输出略有不同(它说“ cc”而不是“ gcc”)。因此,其中一定有一些在看argv [0]。
Dan Molding 2009年

14
您的回答促使我自己查看源代码。我发现argv [0]确实分配给了“程序名”,最终将其传递给其他函数(并存储在环境中)。尽管我没有进行详尽的搜索,但从我的看到,它仅用于显示目的(例如,在“ --version”输出,“ usage”输出,错误消息等中)。
Dan Moulding 2009年

我只是注意到,只有在cc和gcc是同一可执行文件的情况下,这才是正确的。系统可能具有不同的二进制文件吗?想象cc可以链接到clang二进制文件,而gcc可以链接到gcc。诚实的问题,我不知道。
约翰内斯·绍布

15

在我看来,cc(链接到一些旧的SUS规范)旨在成为与供应商无关的系统编译器接口。它被标记为旧版:

c89实用程序提供了与ISO C标准的接口,但是cc实用程序接受未指定的C语言方言:它可以是Standard C,通用C或某些其他变体。可移植的C程序应编写为符合ISO C标准并使用c89进行编译。

POSIX有一个名为的实用程序c99,我相信它是的继承者c89。它说

c99实用程序基于最初在ISO POSIX-2:1993标准中引入的c89实用程序。c89的一些更改包括对“标准库”部分内容的修改,以考虑新的标题和选项。例如,将其添加到-l rt操作数,并为跟踪功能添加-l跟踪操作数。

我对所有这些不同的标准都不是很熟悉,但是看起来更新的SUSv3(POSIX:2004)和更新的POSIX:2008(似乎还没有SUS编号)没有指定实用程序调用cc了,但只有实用程序调用了c99。顺便说一句,我的Linux系统(Arch_Linux)包含的联机帮助c99,但不是c89,但只包含一个叫做效用cc,但既不c89也没有c99。那里很混乱:)


1
有趣的链接。可能有人应该告诉GNU Make people,因为如果您不重写$ {CC},它仍将默认调用“ cc”。显然,他们应该默认使用其他实用程序之一。根据标准,似乎c89应该是首选实用程序。
Dan Moulding 2009年

1
OTOH,因为它写于1997年,所以也许最近这些天首选的实用程序应该是c99。
Dan Moulding 2009年

1
是的,SUSv3不再包含c89。我链接过的只有旧版推荐(SUSv2)
约翰内斯·

12

在我的Mac上,来自man gcc

在Apple版本的GCC中,cc和gcc实际上都是指向名为gcc-version之类的编译器的符号链接。同样,c ++和g ++是指向名为g ++-version之类的编译器的链接。

基于此,我假设cc和gcc行为相同。


17
在Unix世界中,通常会设置多个指向同一可执行文件的链接,并且会根据调用时使用的名称来更改一些默认值。
哈维尔2009年

哇,没有解释就没事了-非常有帮助...也许他们不喜欢什么?
stefanB 2009年

1
也许他们不知道Mac OS X是否完全兼容posix Unix系统
stefanB

7
不,也许他们会考虑混淆以下逻辑链:“符号链接到相同的可执行文件->相同的行为”。比如所有的基本命令行utils的可以被符号链接到busybox的最小系统,但功能完全独立utils的
埃夫拉伊姆

10

今天我也有同样的疑问,我试图自己找到它:

因此,基本上cc指向gcc

您也可以使用cc -v和检查gcc -v。如果它们打印出相同的内容,则表示它们完全相同。


5
但是请注意Javier对stefanB的回答:Unix将程序的“程序名称”作为第0个命令行参数,并且Unix中的许多程序都设置有来自许多不同名称和更改的符号链接。他们的行为取决于使用哪个名字来称呼他们。(例如,gunzip是gzip的链接,但如果调用gzip,它将压缩内容,如果调用gunzip,则将其解压缩。)因此,如果通过名为“ cc”的符号链接运行GCC,则GCC的行为可能完全不同。
Brooks Moses 2010年

7

即使gcc的操作与argv [0]的值无关,无论您指定哪个编译器,并非所有软件都将操作相同。

在RHEL 5.5(gcc 4.1.2)上构建zlib 1.2.5时:

但:

和:

configure脚本未考虑Linux系统上cc可能为gcc的可能性。因此,请谨慎对待假设。


2
这不用说。编译器的行为没有任何不同。这是configure脚本的一个缺点。该脚本知道gcc可以生成共享库,并且知道在Linux上编译共享库时gcc需要该-fPIC选项。如果编译器不是gcc,则configure尝试测试编译器是否可以生成共享库。但是,它无法判断未知的编译器需要哪些编译器标志,因此用户必须提供它们。您需要在命令行上提供必要的标志(例如通过CFLAGS=-fPIC)。
Dan Molding 2010年

3
这是作为辅助性警告而非答案。在上述情况下,将gcc调用为cc不会导致它以不同的方式运行,但是调用软件以非直观的方式运行,从而导致出现不同的行为。
ednos 2011年

3

cc只是UNIX调用编译器的方式,它将在所有Unices上运行。


2
这没有解决问题。
bortzmeyer

3
实际上,cc在Unix上的意思是“ C编译器”,仅此而已。
ismail 2009年

1
发问者也询问了cc和gcc的区别。这也可以作为答案并解决问题,imo
Johannes Schaub-litb

3

这个线程可能很旧,但我想添加一些东西(也许将来会有人发现)。

如果您编译此程序

使用“ gcc”,然后将其传递给“ AAAAAAAAAAAAAAAAAAAAAAAAAAAA”作为参数,它将不会溢出到buffer2中,而如果使用“ cc”进行编译则不会溢出,这对我来说是一个提示,如果您使用“ gcc”,则表示内存管理可能通过在字段buff1和buff2的内存段之间放置空间来实现不同的工作?

也许更有经验的人可以将光明带入这里的黑暗中。


1
我尝试了这一点(在gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1〜14.04)上),关闭并打开了堆栈保护器,并且两端都检测到分段错误堆栈粉碎,最终cc链接到/ etc / Alternatives / cc,它链接到/ usr / bin / gcc。正如@abcoep所说,cc和gcc仅在制表符补全方面有所不同(据我调查)。
Kyslik '17

2

GCC文档中没有任何内容表明,如果GCC的可执行文件名称不是gcc而是cc,则GCC的行为将有所不同。GNU Fortran编译器甚至提到

gcc命令的版本(也可以作为系统的cc命令安装)


2

“不会。无论是通过'gcc'还是'cc'调用,GCC的行为都相同。”

[引自原始帖子。]

根据我在Ubuntu 14.04上的经验,情况并非如此。

当我使用以下命令编译程序时:

我的代码行为没有任何变化。但是当我使用

它的行为确实有所不同。(在两种情况下,我都将适当的更改合并到此处描述的代码中以使-finstrument-functions功能正常工作)。


1

考虑到这是来自UNIX的,我想说“ cc”是通用名称,“ gcc”是实际的编译器。也就是说,“ gcc”提供了“ cc”,因此寻找“ cc”的程序将找到并使用“ cc”,而完全不了解所使用的实际编译器。

另外,UNIX程序应该不知道用于调用它们的实际名称(请考虑使用Windows桌面快捷方式-检查快捷方式的名称是没有意义的),因此,“ gcc”和“ cc”不会如果“ cc”是指向“ gcc”的链接,则同样。

当然,除非“ cc”不是符号链接,而是称为gcc的shellscript。


2
gzip检查其名称。如果其名称为gunzip,则假定为-d。
约书亚

3
“此外,UNIX程序应该不知道用于调用它们的实际名称”,这绝对不是事实。您听说过多次调用二进制文件吗?即忙箱?busybox.net
mateusza

2
毕竟,“ sh”通常是“ bash”的符号链接,这使其表现为POSIX shell。sh <-> bash实际上与cc <-> gcc非常相似。
Johannes Schaub-litb

1
好吧,gzip <-> gunzip是同一个实用程序的一种情况,提供了两个不同的实用程序。对于gcc <-> cc,它提供了一件事。我确实对unix工具具有argv [0]无关性进行了概括,但是在大多数情况下,这只是因为否则,如果重命名它们会中断。如果一个二进制文件提供了多个实用程序,那么可以,直接调用它和调用它创建的符号链接以提供所讨论的工具之间是有区别的,但是gcc <-> cc并非如此:除非语义(即预期行为) )更改,由于历史原因,它们是同义词。
艾伦·梅

1

对于我的操作系统(Ubuntu 14.04)cc,不允许制表符完成,而允许gcc

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.