编译时3个编译器CC,gcc,g ++有什么区别 C和C ++代码就汇编而言 代码生成,可用库,语言功能等?
答案 0 :(得分:103)
对此的答案是特定于平台的;例如,Linux上发生的情况与Solaris上发生的情况不同。
简单部分(因为它不是特定于平台的)是'gcc'和'g ++'的分离:
困难部分,因为它是特定于平台的,是'CC'(和'cc')的含义。
但是,即使在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链接。要检查它。
类似地,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++