cc1和gcc之间的关系?


23

我试图将Ruby安装在Linux服务器上的主目录中(没有root用户访问权限),这当然需要使用gcc。我能找到的最接近的东西是一个具有该名称的目录,(如果您深入的话)包含cc1

>: find / -iname gcc 2> /dev/null
/usr/libexec/gcc


>: tree -if /usr/libexec/gcc
/usr/libexec/gcc
/usr/libexec/gcc/x86_64-redhat-linux
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1/cc1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.2 -> 4.1.1

CC1重定向到Wikipedia上的GCC的事实似乎暗示着一些接近身份的事实,但是,在GCC页面上,除了关于重定向的注释外,没有其他提及CC1的信息,并且Google搜索对我没有任何帮助,并且我尝试cc1gcc失败的地方。

它们之间到底是什么关系?它给我在此机器上编译Ruby的希望吗?

Answers:


28

GCC的编译有多个阶段,每个阶段使用不同的内部命令。具体而言,首先使用cpp对C进行预处理,然后将其编译为汇编,汇编为机器语言,然后将其链接在一起。

cc1是​​内部命令,用于获取预处理的C语言文件并将其转换为程序集。它是编译C的实际部分。对于C ++,有cc1plus和其他用于不同语言的内部命令。

在Wikibooks上有一本书,用图片解释了该过程

不幸的是,cc1是一个内部命令,只是安装的一部分,如果仅此而已,您将无法编译它们。


2
通常的术语是“前端”。
基思·汤普森

1
您确定需要预处理的C文件吗?我似乎能够cc1使用#include#define指令进行文件
归档

10

gcc套件的名称cc只是该套件的C编译器。

这个单词cc也是unix系统下任何给定的c编译器的通用名称,例如,CC在给定的构建脚本或配置脚本中找到一个称为环境变量的情况并不罕见,如果您想学究,该变量通常指向ac编译器不一定执行已编译对象的链接,通常用于指代“仅”编译的编译器。但是ccfrom gcc可以输出完成的可执行文件,因此也可以使用其链接器执行此最后一步。

这个词cc1通常是“内部”使用的,或者在阅读GNU文档时(例如),它也根据它们所属的语言或编译器(在这种情况下cc1 =属于c编译器)来命名与gcc相关的库。

gcc实际上,如果您问单词的含义是什么cc1

gcc -print-prog-name=cc1

它应使用cc编译器的库路径来回答,因此您尝试执行的是库而不是真正的可执行文件。

将CC记为c编译器并简化所有操作,绕过此cc1,要简单得多,除非您想开始漫长的旅程,否则您无需知道内部工作原理。


4

如其他人所述,gcc使用cc1

和其他子程序(如和)被调用的确切方式由spec文件格式决定。cc1cppld

当前的规格文件可以通过以下方式查看:

gcc -dumpspecs

相关部分似乎是:

*cc1_options:
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*} %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)}  %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}}  %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{Qy:} %{-help:--help} %{-target-help:--target-help} %{-version:--version} %{-help=*:--help=%*} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{coverage:-fprofile-arcs -ftest-coverage}

您可以将自己的规格文件用于:

gcc -specs=<specs-file>

当然,传递给GCC的命令行选项会间接更改子流程的调用方式。但是,操作规范文件可为您提供更大的灵活性,并允许您执行命令行选项无法执行的操作,例如/programming/7493620/inhibit-default-library-paths-with-gcc

您可以通过以下方法观察正在运行的内容:

gcc -v hello_world.c |& grep cc1

样本输出:

/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch x86_64-linux-gnu hello_world.c -quiet -dumpbase hello_world.c -mtune=generic -march=x86-64 -auxbase hello_world -version -fstack-protector -Wformat -Wformat-security -o /tmp/ccvcVNAX.s

1

cc1 是预处理器和编译器,其输入是C源代码,输出是汇编代码。

您可以看到cc1是通过发出(实际上取决于版本的语法)调用的命令之一(实际上是第一个):
gcc-8 -v SOMESOURCE.c

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.