将GCC称为“cc”与“gcc”

时间:2009-06-02 14:49:12

标签: c linux gcc compiler-construction gnu

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

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

编辑:到目前为止收到的答案都没有给出明确的“是”或“否”,如果GCC在相对于另一种方式调用时行为是否会有所不同。然而,潜入源头检查其行为的想法导致我走上了这条道路。基于我在那里找到的东西,我现在相信答案是:

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

11 个答案:

答案 0 :(得分:35)

对于笑脸,我只是追溯了如何在gcc中使用argv[0] main.c - > top_lev.c - > opts.c - > {{1}并且看起来langhooks.c目前仅用于在失败时提供argv[0]报告的内容。如果malloc不是argv[0],则似乎没有任何行为更改。

答案 1 :(得分:14)

在我看来,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但不是c89的联机帮助页,但只包含一个名为cc的实用程序,但c89和{ {1}}。那里有很多困惑:))

答案 2 :(得分:12)

在我的Mac上man gcc

  

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

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

答案 3 :(得分:8)

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

$ 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 -vgcc -v进行查询。如果他们打印出相同的东西,那意味着他们完全一样。

答案 4 :(得分: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的可能性。所以,要小心你的假设。

答案 5 :(得分:3)

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

答案 6 :(得分:3)

这个帖子可能很旧,但我想添加一些内容 (也许有人会在将来找到它。)

如果你编译了这个程序

template <unsigned N>
struct myclass
{
    unsigned f () { return N; }
    unsigned g () { return N-1; }
};

template <>
struct myclass <0>
{
    unsigned f () { return 0; }
};

使用&#34; gcc&#34;,然后通过它&#34; AAAAAAAAAAAAAAAAAAAAAAAAA&#34;作为参数,它不会溢出到buffer2中,而如果你使用&#34; cc&#34;进行编译,这对我来说是一个提示,如果你使用&#34; gcc&#34;,内存管理工作不同,也许是通过在字段buff1&amp;的存储段之间放置空格。 buff2?

也许有经验更丰富的人可以在这里把光投入黑暗中。

答案 7 :(得分:2)

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

  

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

答案 8 :(得分:2)

  

“不。不管是否通过'gcc'调用,GCC的行为都相同   或'cc'。“

     

[引自原帖。]

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

当我使用以下程序编译程序时

gcc -finstrument-functions test.c

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

进行编译时
cc -finstrument-functions test.c

它的行为有所不同。 (在这两种情况下,我都将适当的更改合并到我的代码here中,以使-finstrument-functions有效)。

答案 9 :(得分:1)

考虑到这是来自UNIX,我会说“cc”是通用名称,“gcc”是实际的编译器。即“gcc”提供“cc”,因此寻找“cc”的程序会找到并使用“cc”,对所使用的实际编译器一无所知。

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

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

答案 10 :(得分:1)

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