70

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

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

编辑:到目前为止收到的答案都没有给出明确的“是”或“否”,即如果以一种方式调用与另一种方式调用,GCC 的行为是否会有所不同。然而,深入研究源代码以检查其行为的想法使我走上了这条路。根据我在那里的发现,我现在相信答案是:

不。无论是通过 "gcc" 还是 "cc" 调用 GCC,它的行为都是相同的

4

11 回答 11

35

argv[0]对于咧嘴笑,我只是从 gcc ( main.c-> top_lev.c-> opts.c-> ) 中追踪了如何使用langhooks.c它,它似乎argv[0]目前仅用于malloc在失败时提供一些报告。argv[0]如果不是. ,则似乎没有任何行为变化gcc

于 2009-06-02T15:41:56.207 回答
15

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

c89 实用程序提供了与 ISO C 标准的接口,但 cc 实用程序接受 C 语言的未指定方言:它可能是标准 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但 not的联机帮助页c89,但只包含一个名为cc, but not c89nor的实用程序c99。那里有很多混乱:)

于 2009-06-02T15:07:23.953 回答
12

在我的 Mac 上来自man gcc

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

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

于 2009-06-02T14:55:11.607 回答
11

I had the same doubt today and I tried to find it on my own:

$ 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

So, basically cc points to gcc.

You could also check using cc -v and gcc -v. If they print out the same thing, that means they are exactly the same.

于 2010-02-28T12:18:06.050 回答
7

即使 gcc 的操作与 argv[0] 的值无关,也不是所有的软件都会以相同的方式操作,无论您指定哪个编译器。

在 RHEL 5.5 (gcc 4.1.2) 上构建 zlib 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.

配置脚本不考虑 Linux 系统上的 cc 可能是 gcc 的可能性。所以,要小心你的假设有多远。

于 2010-12-17T16:25:45.470 回答
3

cc 只是调用编译器的 UNIX 方式,它适用于所有 Unices。

于 2009-06-02T15:15:48.757 回答
3

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

如果你编译了这个程序

#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”作为参数传递,它不会溢出到buffer2,而如果您使用“cc”编译它会溢出,这对我来说是一个提示,如果您使用“gcc”,内存管理工作方式不同,也许是通过在 buff1 和 buff2 字段的内存段之间放置空间?

也许有更多经验的人可以在这里为黑暗注入光明。

于 2015-06-18T17:28:40.333 回答
2

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

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

于 2009-06-02T15:18:21.450 回答
2

“不。无论是通过 'gcc' 还是 'cc' 调用 GCC,它的行为都是一样的。”

[引自原帖。]

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

当我使用以下方法编译我的程序时:

gcc -finstrument-functions test.c

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

cc -finstrument-functions test.c

它的行为确实不同。(在这两种情况下,我都在此处描述的代码中加入了适当的更改,以使 -finstrument-functions 工作)。

于 2014-09-09T18:35:58.363 回答
1

考虑到这是来自 UNIX,我会说“cc”是通用名称,“gcc”是实际的编译器。即“gcc”提供“cc”,因此寻找“cc”的程序会找到并使用“cc”,而幸福地不知道正在使用的实际编译器。

此外,UNIX 程序应该不知道用于调用它们的实际名称(想想 Windows 桌面快捷方式——检查快捷方式的名称是没有意义的),所以,不,“gcc”和“cc”做如果“cc”是指向“gcc”的链接,也是一样的。

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

于 2009-06-02T15:06:00.897 回答
1

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

于 2016-03-30T14:45:21.850 回答