【问题标题】:Is GCC a compiler or is it a collection of tools for the compilation process?GCC 是编译器还是编译过程的工具集合?
【发布时间】:2020-08-24 12:46:26
【问题描述】:

我是 GNU 和 GCC 的新手,如果我的问题听起来很愚蠢,很抱歉。

我们知道 GCC 代表 GNU Compiler Collection,所以我认为 gcc 只是一个编译器(来自编译器集合)。

但我也读到 gcc 是一个编译器驱动程序,它包含预处理器 (cpp)、编译器 (cc1)、汇编器 (as) 和链接器 (ld)。

所以看起来GCC不是编译器,但是为什么wiki说:

“GCC 是 GNU 工具链的关键组件,也是大多数与 GNU 和 Linux 相关的项目的标准编译器

cc1中的“1”是什么意思,为什么叫cc1,而不是cc2、cc3……等等?

【问题讨论】:

标签: c gcc gnu


【解决方案1】:

在大多数情况下,您(有点不准确)调用 gcc 编译器。一个原因是您可以使用单个 gcc 命令运行整个工具链,至少对于简单项目而言。假设你有这个main.c

// main.c
#include <stdio.h>
int main(void)
{
    printf("Hello, world!\n");
}

并用它编译

gcc main.c

然后您提到的所有内容,cpp、cc1、as 和 ld 都将参与创建可执行文件 a.out。嗯,差不多。 cpp 是旧版本,新版本的编译器集成了预处理器。

如果要查看预处理器的输出,请使用gcc -E main.c

正如我所提到的,现在预处理器和编译器是集成在一起的,所以如果没有预处理器,您将无法真正运行cc1。但是您可以使用gcc -S main.c 生成一个汇编文件,这将产生main.s。您可以使用gcc -c main.s 将其组装到一个目标文件中,这将产生main.o,然后您可以将其与gcc main.o 链接以产生最终的a.out

https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/GCC/cc1/index(强调我的)

cc1 也称为编译器本身。

cc1 预处理一个 c 翻译单元并将其编译成汇编代码。汇编代码通过汇编器转换为目标文件。

早期版本的 cc1 使用 /usr/bin/cpp 进行预处理。

https://renenyffenegger.ch/notes/Linux/fhs/usr/bin/cpp(强调我的)

预处理器。

cpp 不会与 c++ 混淆。

预处理器关心诸如

之类的事情
  • 宏展开
  • 删除 cmets
  • 三字转换
  • 转义换行拼接
  • 指令处理

较新版本的 gcc 不会直接调用 /usr/bin/cpp 来预处理翻译单元。相反,预处理由编译器正确的 cc1 执行。

我几乎会认为这是一个副本,但不可能创建跨站点副本。 Relationship between cc1 and gcc?

相关:'Compiler proper' command for C program

cc1中的“1”是什么意思,为什么叫cc1,而不是cc2、cc3……等等?

不知道。我的第一个猜测是他们只是在cc 中添加了一个 1,它曾经是并且现在是 Unix(不包括 Linux)系统上的标准编译器。在大多数 Linux 系统上,cc 只是指向gcc 的链接。但另一个很好的猜测是它代表编译的第一阶段。不过还没有找到好的来源。

【讨论】:

  • cc1中的“1”是什么意思?
  • @amjad 不知道。可能只是他们添加的一些东西,使其与旧的 cc 编译器不同
  • @amjad C编译器第一阶段
  • @DavidRanieri 你知道还是在猜测?
  • @DavidRanieri 是的,我看过那个页面,但它只是说cc1 是第一阶段,而不是1 的含义。
猜你喜欢
  • 2011-07-01
  • 2017-10-13
  • 2013-02-02
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多