【问题标题】:Difference between CC, gcc and g++?CC,gcc和g ++之间的区别?
【发布时间】:2010-12-03 17:58:34
【问题描述】:

编译时CC、gcc、g++这3个编译器有什么区别 汇编方面的 C 和 C++ 代码 代码生成、可用库、语言特性等?

【问题讨论】:

标签: c++ c gcc compilation


【解决方案1】:

这个问题的答案是特定于平台的;例如,Linux 上发生的事情与 Solaris 上发生的事情不同。

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

  • gcc 是来自 GCC(GNU 编译器集合)的 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++ 生成的目标代码不兼容——它们是两个独立的编译器,具有不同的约定,例如异常处理和名称修改(以及名称mangling 是故意不同的,以确保不兼容的目标文件不会链接在一起!)。这意味着如果你想使用一个用 CC 编译的库,你必须用 CC 编译你的整个程序。这也意味着,如果你想使用一个用 CC 编译的库和另一个用 g++ 编译的库,那么你就不走运了。您至少必须重新编译其中一个库。

就生成的汇编程序的质量而言,GCC(GNU Compiler Collection)做得非常好。但有时本机编译器工作得更好一些。我相信,英特尔编译器具有更广泛的优化,尚未在 GCC 中复制。但是任何这样的冠冕堂皇都是危险的,而我们不知道你关心的是什么平台。

在语言特性方面,编译器通常都与当前标准(C++98、C++2003、C99)相当接近,但标准语言与支持的语言之间通常存在细微差别编译器。对于所有 C 编译器,较旧的 C89 标准支持基本相同(并且完整)。语言的阴暗角落存在差异。您需要了解“未定义的行为”、“系统定义的行为”和“未指定的行为”;如果你调用未定义的行为,你会在不同的时间得到不同的结果。还有许多选项(尤其是使用 GCC)来调整编译器的行为。如果您知道自己只针对该编译器系列,那么 GCC 有多种扩展可以让生活变得更简单。

【讨论】:

  • 在 OSX(至少是 Sierra 10.2)上,它是 clang 的符号链接。
  • 对于 Debian buster $ readlink -f $(which cc) $(which gcc) /usr/bin/x86_64-linux-gnu-gcc-8 /usr/bin/x86_64-linux-gnu-gcc-8
【解决方案2】:

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

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

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

【讨论】:

  • 你能解释一下“驱动程序二进制”是什么意思吗?
  • 大多数 C 编译器,特别是 GCC,都有许多程序来完成编译工作。有一个顶层程序,叫做“gcc”,即编译器驱动程序;它解析无数命令行选项并协调编译器的其他阶段——解析器/分析器、优化器、汇编器和链接器,通常是(预处理器现在通常不是一个单独的阶段,除非您只请求预处理)。它(编译器驱动程序)是一个相当复杂的程序,尽管它本身从未接触过 C 源文件。
  • CC 也是 Sun C++ 编译器 - 而不是环境变量。
  • SGI的C++编译器也是CC的。
  • 好吧,我想 Managu 认为 ./configure+make 可以采用名为 CC 的环境变量来影响使用的 C 编译器,但除此之外通常没有环境变量那个名字。
【解决方案3】:

我只想添加一个信息什么 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++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 2010-10-14
    • 2011-08-16
    • 2017-07-16
    • 2010-09-15
    相关资源
    最近更新 更多