将GCC称为"cc"与"gcc"

Dan*_*ing 67 c linux compiler-construction gcc gnu

我知道在大多数GNU/Linux系统中,GCC可以通过命令行中的名称"cc"调用(而不是"gcc").当GCC以一种方式与另一种方式被调用时,它的行为是否有任何区别?

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

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

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

pli*_*nth 35

对于笑话,我只是追溯了如何argv[0]在gcc(main.c- > top_lev.c- > opts.c- > langhooks.c)中使用它,它似乎argv[0]目前只用于malloc在失败时提供报告.如果没有出现任何改变行为argv[0]比其他任何东西gcc.

  • 你的回答促使我自己查看源代码.我发现argv [0]确实被分配到"programname",最终会被传递给其他函数(并存储在环境中).虽然我没有进行*穷举*搜索,但从我所看到的,它只用于显示目的(例如在"--version"输出,"用法"输出,错误消息等). (13认同)
  • 我唯一的问题是"cc --version"给出了"gcc --version"(它说"cc"而不是"gcc")的*略有不同的输出.所以*那里的*必须要看argv [0]. (2认同)

Joh*_*itb 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也不是c99.很多混乱:)


ste*_*anB 12

在我的Mac上man gcc:

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

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

  • 在Unix世界中,通常会设置多个指向同一可执行文件的链接,并根据调用时使用的名称更改某些默认值. (17认同)
  • 不,也许他们认为混淆以下逻辑链:"符号链接到相同的可执行文件 - >相同的行为".例如,所有基本命令行工具都可以在最小系统上符号链接到busybox,但作为完全独立的工具来运行 (7认同)
  • 也许是苹果公司的仇敌?:) (3认同)

N 1*_*1.1 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
Run Code Online (Sandbox Code Playgroud)

所以,基本上cc指向gcc.

你也可以检查使用cc -vgcc -v.如果他们打印出相同的东西,那意味着他们完全一样.

  • 请注意Javier对stefanB的答案给出的评论 - Unix将程序的名称作为第0个命令行参数提供给程序,并且Unix中的许多程序都使用来自许多不同名称的符号链接进行设置并更改他们的行为取决于用于调用它们的名称.(例如,gunzip是gzip的一个链接,但是如果你调用gzip就会压缩它,如果你调用gunzip就会解压缩它们.)因此,如果你通过一个名为'cc'的符号链接运行GCC可能会有不同的行为,这是完全合理的. . (5认同)

edn*_*nos 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
Run Code Online (Sandbox Code Playgroud)

但:

$ 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.
Run Code Online (Sandbox Code Playgroud)

和:

$ 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.
Run Code Online (Sandbox Code Playgroud)

configure脚本不考虑Linux系统上的cc可能是gcc的可能性.所以,要小心你的假设.

  • 这是一个辅助谨慎而不是答案.在上述情况下调用gcc作为cc不会导致它以不同的方式运行,但是调用软件以非直观的方式操作,导致出现不同的行为. (3认同)
  • 这不用说.编译器的行为没有任何不同.这是`configure`脚本的缺点.该脚本知道`gcc`可以生成共享库,它知道`gcc`在Linux上编译共享库时需要`-fPIC`选项.如果编译器不是`gcc`,那么`configure`会尝试测试编译器是否可以生成共享库.**但是**它无法确定它不知道的编译器所需的编译器标志,因此用户必须提供它们.您需要在命令行上提供必要的标志(例如,通过`CFLAGS = -fPIC`). (2认同)