3个编译器CC,gcc,g ++在编译C和C ++代码时,在汇编代码生成,可用库,语言功能等方面有何区别?
3个编译器CC,gcc,g ++在编译C和C ++代码时,在汇编代码生成,可用库,语言功能等方面有何区别?
Answers:
答案是特定于平台的。例如,Linux上发生的事情与Solaris上发生的事情不同。
最简单的部分(因为它不是特定于平台的)是'gcc'和'g ++'的分离:
困难的部分是特定于平台的,因此它是“ CC”(和“ cc”)的含义。
但是,即使在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具有各种扩展,可以简化工作。
CC
是引用系统的C编译器的环境变量。它指向的内容(可访问的库等)取决于平台。通常它会指向/usr/bin/cc
实际的c编译器(驱动程序)。在linux平台上,CC
几乎总是指向/usr/bin/gcc
。
gcc
是GNU编译器集合的驱动程序二进制文件。它可以编译C,C ++以及其他语言。它通过文件扩展名确定语言。
g++
是类似于的驱动程序二进制文件gcc
,但具有一些用于编译C ++的特殊选项。值得注意的是(根据我的经验),g++
默认情况下将链接libstdc ++,而gcc
不会。
./configure
+ make
可以采用一个环境变量CC
来影响所使用的C编译器,但是否则通常不会有该名称的环境变量。
我只想添加一个信息,说明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++