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

问题描述

我是GNU和GCC的新手,对不起,我的问题听起来很愚蠢。

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

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

因此,看起来GCC不是编译器,但为什么维基说:

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

在cc1中,“ 1”是什么意思,为什么叫cc1,而不是cc2,cc3 ...等等?

解决方法

在大多数情况下,您(有点不准确)调用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 ++混淆。

预处理器与诸如此类的事情有关

  • 宏扩展
  • 删除评论
  • 字母转换
  • 转义的换行符
  • 指令处理

较新版本的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的链接。但是另一个很好的猜测是它代表了编译的第一阶段。尚未找到好的来源。