CC,gcc和g ++之间的区别?
在汇编代码生成,可用库,语言特性等方面编译C和C ++代码时,3个编译器CC,gcc,g ++之间有什么区别?
对此的答案是特定于平台的; 例如,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有各种扩展,如果你知道你只是针对这个编译器系列,那么它可以使生活更简单。
CC
是涉及系统C编译器的环境变量。 它指向什么(图书馆可访问等)取决于平台。 通常它会指向/usr/bin/cc
,即实际的c编译器(驱动程序)。 在Linux平台上, CC
几乎总是指向/usr/bin/gcc
。
gcc
是GNU编译器集合的驱动程序二进制文件。 它可以编译C,C ++和其他可能的语言; 它通过文件扩展名来确定语言。
g++
是像gcc
这样的驱动程序二进制文件,但为编译C ++而设置了一些特殊选项。 值得注意的是(根据我的经验), g++
默认链接libstdc ++,而gcc
不会。
上一篇: Difference between CC, gcc and g++?
下一篇: Why does the order in which libraries are linked sometimes cause errors in GCC?