CC,gcc和g ++之间的区别?


Answers:


122

答案是特定于平台的。例如,Linux上发生的事情与Solaris上发生的事情不同。

最简单的部分(因为它不是特定于平台的)是'gcc'和'g ++'的分离:

  • gcc是来自GCC(GNU编译器集合)的GNU C编译器。
  • g ++是来自GCC的GNU C ++编译器。

困难的部分是特定于平台的,因此它是“ CC”(和“ cc”)的含义。

  • 在Solaris上,CC通常是Sun C ++编译器的名称。
  • 在Solaris上,cc通常是Sun C编译器的名称。
  • 在Linux上(如果存在),CC可能是g ++的链接。
  • 在Linux上,cc是gcc的链接。

但是,即使在Solaris上,cc也可能是来自的旧的基于BSD的C编译器/usr/ucb。在实践中,通常不会安装该模块,而只有一个存根模块会失败,这对尝试编译和安装自配置软件的人员造成了严重破坏。

在HP-UX上,默认的“ cc”仍然是仅安装K&R的C编译器,以允许在必要时重新链接内核,并且由于不支持标准C而不能用于现代软件工作。您必须使用其他编译器名称('acc'IIRC)。类似地,在AIX上,系统C编译器使用诸如“ xlc”或“ xlc32”之类的名称。

传统上,默认的系统编译器称为“ cc”,而自配置软件在不知道还要使用什么功能时会改用该名称。

POSIX尝试通过要求程序c89(最初)和以后的c99存在来立法解决此问题。这些是与ISO / IEC 9899:1989和9899:1999 C标准兼容的编译器。POSIX成功是值得怀疑的。


该问题询问功能和库方面的差异。和以前一样,答案部分是平台特定的,部分是通用的。

C编译器和C ++编译器之间存在很大的鸿沟。C ++编译器将接受C ++程序,并且不会编译任意C程序。(尽管可以在C ++也理解的子集中编写C,但是许多C程序不是有效的C ++程序)。同样,C编译器将接受C程序,并拒绝大多数C ++程序(因为大多数C ++程序使用C中不可用的构造)。

可用的库集取决于语言。C ++程序通常可以在给定平台上使用C库。C程序通常不能使用C ++库。因此,C ++有大量可用的库。

请注意,如果您使用的是Solaris,则CC生成的目标代码与g ++生成的目标代码不兼容-它们是两个单独的编译器,具有诸如异常处理和名称修饰之类的不同约定(并且名称修饰是有意为之)以确保不兼容的目标文件不会链接在一起!)。这意味着,如果要使用CC编译的库,则必须使用CC编译整个程序。这也意味着,如果您要使用一个使用CC编译的库和另一个使用g ++编译的库,那么您将很不走运。您至少必须重新编译其中一个库。

就生成的汇编程序的质量而言,GCC(GNU编译器集合)做得很好。但是有时本机编译器的工作会更好一些。我相信,英特尔编译器具有更广泛的优化功能,尚未在GCC中进行复制。但是,如果我们不知道您所关注的平台,那么任何这样的修饰都是危险的。

就语言功能而言,编译器通常都非常接近当前标准(C ++ 98,C ++ 2003,C99),但是标准语言和编译器支持的语言之间通常存在细微差异。较早的C89标准支持对于所有C编译器基本上是相同的(并且是完整的)。语言的暗角有所不同。您需要了解“未定义的行为”,“系统定义的行为”和“未指定的行为”;如果您调用未定义的行为,您将在不同的时间得到不同的结果。还有许多选项(尤其是在GCC中)可以调整编译器的行为。如果您知道您只针对该编译器系列,则GCC具有各种扩展,可以简化工作。


1
在OSX(至少是Sierra 10.2)上,它是与clang的符号链接。
乔什·科德洛夫

26

CC是引用系统的C编译器的环境变量。它指向的内容(可访问的库等)取决于平台。通常它会指向/usr/bin/cc实际的c编译器(驱动程序)。在linux平台上,CC几乎总是指向/usr/bin/gcc

gcc是GNU编译器集合的驱动程序二进制文件。它可以编译C,C ++以及其他语言。它通过文件扩展名确定语言。

g++是类似于的驱动程序二进制文件gcc,但具有一些用于编译C ++的特殊选项。值得注意的是(根据我的经验),g++默认情况下将链接libstdc ++,而gcc不会。


1
您能解释一下“二进制驱动程序”的意思吗?
Edan Maor

5
大多数C编译器(特别是GCC)都有许多程序来执行编译工作。有一个名为“ gcc”的顶层程序,它是编译器驱动程序。它解析无数的命令行选项,并协调编译器的其他阶段-解析器/分析器,优化器,汇编器和链接器(通常,预处理器如今通常不是单独的阶段,除非您仅请求预处理)。即使它从未接触过C源文件本身,它(编译器驱动程序)也是一个非常复杂的程序。
乔纳森·勒夫勒

3
CC还是Sun C ++编译器-而不是环境变量。
乔纳森·勒夫勒

1
SGI的C ++编译器也是CC。
亚历克斯·廷格

好吧,我想Managu认为./configure+ make可以采用一个环境变量CC来影响所使用的C编译器,但是否则通常不会有该名称的环境变量。
短暂

5

我只想添加一个信息,说明Linux中的抄送。它与gcc链接。要检查它。 在此处输入图片说明

同样,与c ++相同。

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
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.