【发布时间】:2010-12-03 17:58:34
【问题描述】:
编译时CC、gcc、g++这3个编译器有什么区别 汇编方面的 C 和 C++ 代码 代码生成、可用库、语言特性等?
【问题讨论】:
-
如我的回答中所示 - 您的问题的答案取决于平台,但未指定平台。
标签: c++ c gcc compilation
编译时CC、gcc、g++这3个编译器有什么区别 汇编方面的 C 和 C++ 代码 代码生成、可用库、语言特性等?
【问题讨论】:
标签: c++ c gcc compilation
这个问题的答案是特定于平台的;例如,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++ 生成的目标代码不兼容——它们是两个独立的编译器,具有不同的约定,例如异常处理和名称修改(以及名称mangling 是故意不同的,以确保不兼容的目标文件不会链接在一起!)。这意味着如果你想使用一个用 CC 编译的库,你必须用 CC 编译你的整个程序。这也意味着,如果你想使用一个用 CC 编译的库和另一个用 g++ 编译的库,那么你就不走运了。您至少必须重新编译其中一个库。
就生成的汇编程序的质量而言,GCC(GNU Compiler Collection)做得非常好。但有时本机编译器工作得更好一些。我相信,英特尔编译器具有更广泛的优化,尚未在 GCC 中复制。但是任何这样的冠冕堂皇都是危险的,而我们不知道你关心的是什么平台。
在语言特性方面,编译器通常都与当前标准(C++98、C++2003、C99)相当接近,但标准语言与支持的语言之间通常存在细微差别编译器。对于所有 C 编译器,较旧的 C89 标准支持基本相同(并且完整)。语言的阴暗角落存在差异。您需要了解“未定义的行为”、“系统定义的行为”和“未指定的行为”;如果你调用未定义的行为,你会在不同的时间得到不同的结果。还有许多选项(尤其是使用 GCC)来调整编译器的行为。如果您知道自己只针对该编译器系列,那么 GCC 有多种扩展可以让生活变得更简单。
【讨论】:
$ readlink -f $(which cc) $(which gcc) /usr/bin/x86_64-linux-gnu-gcc-8 /usr/bin/x86_64-linux-gnu-gcc-8
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 编译器,但除此之外通常没有环境变量那个名字。
我只想添加一个信息什么 cc 在 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++
【讨论】: