因为GCC是用C ++本身编写的,所以没有鸡和蛋的问题吗?


10

从4.8版本开始,C ++编译器GCC(它的G ++部分)不再用C编写,而是用C ++本身编写。我对此有一个假设的问题。

我想知道如何在还没有C ++编译器的新平台上编译GCC的C ++代码。当然,您可以使用在其他计算机上编译的预构建二进制文件。或者,您可以使用用C编写的旧版GCC,然后使用它编译当前版本。

但是,如果没有预构建的二进制文件,而只有最新版本,您就会陷入困境,对吗?如果没有,那么从GCC项目的C转换为C ++会对这种情况产生其他影响吗?


3
我不确定您在这里要问什么,尽管您可能希望阅读有关交叉编译的信息

5
全新的平台将完全没有C ++编译器或C编译器。交叉编译就是答案。
doc

1
你或许应该阅读GCC的举动,C ++移动到C ++,并可能讨论GCC现在需要C ++打造 Reddit上。我不确定gcc4.8之前的版本是否可以使用随同任意操作系统一起打包的C编译器来构建(这在很多情况下将您限制为C89)。

2
对于这个问题,我没有什么特别的C ++,C或任何其他语言都存在这个问题,不是吗?
RemcoGerlich 2014年

Answers:


16

这实际上是一个众所周知的概念,称为bootstrapping。基本上,某个地方存在一个最小的C代码库,用于构建能够构建当前GCC代码库的GCC版本。数十年来,自托管语言一直在做这样的事情。


其实没有 事实不再是这样了(还有问题所在)。 gcc不能再仅由AC编译器构建。他们使用gcc编译的唯一保证是可以使用Ncc版本N-1构建N版本的gcc。

9
@MichaelT:但是可以使用C编译器构建GCC的早期版本,然后可以编译用C ++编写的更高版本,这就是我所说的。
梅森·惠勒2014年

我还要指出问题中的问题:However, without prebuilt binaries and just the newest version, you were stuck, right? If not, are there other implications on this situation raised by the switch from C to C++ of the GCC project?-它假定您无权访问以前的版本,也没有解决代码库从C到C ++转换的其他含义。

9

创建使用与编译语言相同的语言编写的编译器称为bootstrapping。维基百科文章描述了引导编译器的多种方法。

鉴于您的限制,即您只有4.8版以上的G ++源代码并且没有针对目标平台的预构建二进制文件(没有现有的C ++编译器),因此可以通过交叉编译来引导G ++编译器。

使用交叉编译引导编译器时,您将构建几个版本的编译器

  1. 在您的PC上,您安装了C ++编译器(可以是任何C ++编译器,不必是G ++)
  2. 使用该编译器,您可以创建一个可以在PC上执行并为目标平台生成代码的G ++交叉编译器。
  3. 使用刚刚构建的G ++交叉编译器,您可以创建可以在目标平台上运行的本机G ++编译器,并为其创建代码。
  4. 大功告成 您已经为新平台创建了C ++编译器。

如果您还没有PC(或类似设备)来执行初始步骤,那么您的确陷入困境,但是处于这种情况并尝试引导编译器的机会可以忽略不计。

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.