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

时间:2009-10-04 14:55:24

标签: c++ c gcc compilation

编译时3个编译器CC,gcc,g ++有什么区别 C和C ++代码就汇编而言 代码生成,可用库,语言功能等?

3 个答案:

答案 0 :(得分:103)

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

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

  • gcc是GCC(GNU Compiler Collection)的GNU C编译器。
  • g ++是GCC的GNU C ++编译器。

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

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

但是,即使在Solaris上,也可能是cc是来自/usr/ucb的旧的基于BSD的C编译器。实际上,通常没有安装,只有一个存根失败,对试图编译和安装自配置软件的人造成严重破坏。

在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),但标准语言和支持的语言之间通常存在细微差别。编译器。对于所有C编译器,旧的C89标准支持基本相同(并且完整)。语言的黑暗角落有所不同。您需要了解“未定义的行为”,“系统定义的行为”和“未指定的行为”;如果您调用未定义的行为,您将在不同的时间获得不同的结果。还有很多选项(特别是使用GCC)来调整编译器的行为。如果您知道自己只是针对该编译器系列,那么GCC具有各种扩展,可以简化生活。

答案 1 :(得分:22)

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

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

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

答案 2 :(得分:3)

我只想添加一个信息,说明Linux中的抄送。它与gcc链接。要检查它。 enter image description here

类似地,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++