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