编辑:到目前为止收到的所有答案都没有明确回答GCC是否会因为以某种方式调用而产生不同的行为。然而,建议查看源代码以检查其行为的想法引导我走上了这条路。基于我在那里发现的内容,我现在相信答案是:
没有。 GCC无论是通过“gcc”还是“cc”调用时行为都是相同的。
仅为了好玩,我刚刚追踪了一下gcc内部如何使用argv[0]
(main.c
-> top_lev.c
-> opts.c
-> langhooks.c
),似乎目前只是用于向malloc
报告失败时的内容。如果argv[0]
不是gcc
,貌似没有任何行为变化。
cc
(指向一些旧的SUS规范的链接)旨在成为系统编译器的供应商中立接口。它被标记为遗留接口。POSIX有一个叫做c89实用程序提供了与ISO C标准的接口,但cc实用程序接受C语言的未指定方言:它可能是标准C、常用C或其他某种变体。可移植的C程序应该按照ISO C标准编写,并使用c89进行编译。
c99
的实用程序,我相信它是c89的后继者。它说:
c99
实用程序基于最初引入ISO POSIX-2:1993标准的c89实用程序。 从c89到c99的一些更改包括修改标准库部分的内容以考虑新的头文件和选项;例如,在“-lrt”操作数中添加了-lrt,并添加了-ltrace操作数以进行跟踪函数。
我并不太熟悉所有这些不同的标准,但看起来较新的SUSv3(POSIX:2004)和最新的POSIX:2008(似乎还没有SUS号码)不再规定叫做cc
的工具,而是只规定了叫做c99
的工具。顺便说一下,我的Linux系统(Arch_Linux)包含了c99
的手册页,但没有c89
,只包含一个叫做cc
的工具,但既没有c89
也没有c99
。很混乱 :)
在我的 Mac 上使用 man gcc
命令:
在 Apple 版本的 GCC 中,cc 和 gcc 实际上都是指向命名为 gcc-version 的编译器的符号链接。类似地,c++ 和 g++ 是指向命名为 g++-version 的编译器的链接。
基于这个,我会认为 cc 和 gcc 的行为是相同的。
which
- 确定可执行文件的位置
file
- 确定文件类型$ which cc
/usr/bin/cc
$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
进行检查。如果它们打印出相同的内容,那就意味着它们完全相同。$ 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.
configure
脚本的一个缺点。该脚本知道gcc
可以生成共享库,并且它知道在Linux上编译共享库时,gcc
需要-fPIC
选项。如果编译器不是gcc
,那么configure
将尝试测试编译器是否能够生成共享库。但是,它不能推断出对于它不知道的编译器需要什么编译器标志,因此您必须提供它们。您需要在命令行上提供必要的标志(例如通过CFLAGS=-fPIC
)。 - Dan Moulding#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;
}
cc是UNIX调用编译器的方式,可以在所有的Unix系统上使用。
“无论是通过'gcc'还是'cc'调用,GCC的行为都是相同的。”
[引自原始帖子。]
根据我的经验,在Ubuntu 14.04中并非如此。
当我使用以下命令编译我的程序时:
gcc -finstrument-functions test.c
我的代码没有任何变化。但是当我使用编译器编译时
cc -finstrument-functions test.c
它确实有不同的行为。(在这两种情况下,我已经将描述如何使-finstrument-functions工作的适当更改纳入了我的代码中,详见此处)。
gcc命令的一个版本(也可能安装为系统的cc命令)
对于我的操作系统(Ubuntu 14.04),cc
不支持制表符自动完成,而gcc
可以。