我是 GNU 和 GCC 的新手,如果我的问题听起来很愚蠢,我很抱歉。
我们知道GCC代表GNU Compiler Collection,所以我认为gcc只是一个编译器(来自编译器集合)。
但我还了解到 gcc 是一个编译器驱动程序,其中包含预处理器(cpp)、编译器(cc1)、汇编器(as)和链接器(ld)。
所以看起来 GCC 不是一个编译器,但为什么 wiki 说:
“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");
}
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之间的关系?
cc1 中的“1”是什么意思,为什么它被称为 cc1,而不是 cc2、cc3 ...等?
不知道。我的第一个猜测是他们只是cc在 Unix(不包括 Linux)系统上的标准编译器上添加了一个 1。在大多数 Linux 系统上,cc只是gcc. 但另一个很好的猜测是它代表编译的第一阶段。虽然还没有找到好的来源。
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |