GCC 是一个编译器还是一个编译过程的工具集合?

5 c gcc gnu

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

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

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

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

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

cc1 中的“1”是什么意思,为什么它被称为 cc1,而不是 cc2、cc3 ...等?

klu*_*utt 2

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

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

并编译它

gcc main.c
Run Code Online (Sandbox Code Playgroud)

然后你提到的所有内容,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/CC-plus-plus/GCC/cc1/index(重点是我的)

cc1 也称为编译器本身。

cc1 预处理 ac 翻译单元并将其编译为汇编代码。使用汇编器将汇编代码转换为目标文件。

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

https://renenyffenegger.ch/notes/Linux/fhs/usr/bin/cpp(重点是我的)

预处理器。

cpp 不应与 c++ 混淆。

预处理器关心的是诸如

  • 宏观扩张
  • 删除评论
  • 三字转换
  • 转义换行符拼接
  • 指令的处理

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

我几乎认为这是一个重复,但不可能创建跨站点重复。cc1和gcc之间的关系?

相关:C 程序的“编译器正确”命令

cc1 中的“1”是什么意思,为什么它被称为 cc1,而不是 cc2、cc3 ...等?

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