我正在使用随编译器 $Y 一起提供的发行版 $X,但我需要编译器版本 $Z

我正在使用随编译器 $Y 一起提供的发行版 $X,但我需要编译器版本 $Z

问题

这个问题以及包含解决该问题的各种方法的答案几乎每天都会在我们的交流中多次出现。如果搜索结果将您带到这里欢迎!如果我在链接到您的问题中留下的评论,您可以放心地假设您的问题可以添加到下面的列表中,因为它属于同一类别:

这些只是[gcc]搜索词降级所标记的众多问题中的四个。那些知识渊博、能够先来交流的读者/用户几乎总是会问我怎样才能……”那些尝试过失败的不幸读者几乎总是会说“它坏了”,或者“我想我坏了一些东西”。这个问题和答案,我将尝试解释为什么混合编译器会破坏所有Linux,并且在答案中我将提供我所知道的解决问题的最简单方法,这不会导致损坏,但会花费一些开销由于这将是一个社区贡献的问答,如果您喜欢我的方法,我恳请您投票。

问题解释

总长DR: 跳至为什么降级编译器会导致问题?

我在各种答案中使用了下面的图片两到三次,我觉得它为我们所有人提供了一个很好的起点。我意识到它很大,因此,如果您愿意,我敦促读者在单独的选项卡中打开它并进行缩放等。

Linux 发行版的时间表

在该列表中找到您的发行版,然后继续阅读。您会注意到您的发行版有一个父发行版。好吧,好吧,我知道使用父发行版(时间线最左边的发行版)的读者会问:

我正在使用最左边的一个,那么它的父母在哪里?

现在我们进入这个问题的核心。例如,让我们填写$X$Y的标题(耐心的读者,$Z即将出现)

  • $X = Fedora 39
  • $Y = 13.2.1-6.fc39

定义

  • 分布(引用维基百科):

Linux 发行版(通常缩写为 distro)是由软件集合组成的操作系统,其中包括 Linux 内核,并且通常包含包管理系统

  • 包管理系统(再次引用):

包管理器或包管理系统是软件工具的集合,它以一致的方式自动执行计算机的安装、升级、配置和删除计算机程序的过程

了解这两项有助于我们回答父发行版问题,但不幸的是还有另一个问题:发行版维护者如何创建发行版?

答案:除内核之外的所有 Linux 软件都存储在GNU 软件 FTP 站点在源代码档案中。所有 Linux 内核均可在源代码档案中下载:Linux 内核档案。简而言之,所有发行版都从相同的源代码开始,包括父发行版

为什么降级编译器会导致问题?

根据之前的定义,发行版是一组或一组相关的软件。这种关系可以在您的发行版的存储库(或您的发行版选择的任何其他名称)中看到。

当新版本(在我们的示例中$X= Fedora 39)可用时,该版本的存储库被锁定,特别是版本锁定,这意味着该存储库中的每个包现在都被锁定时间冻结。一旦冻结就不会改变。它只能在版本受支持的情况下生存,或者在版本升级时消亡。

构建 GCC 所需的工具也在现已冻结的存储库中。 如果用户尝试升级或降级冻结存储库中附带的 GCC,如果成功,版本锁定将会被破坏。为了防止损坏发生,您的操作系统的包管理器会阻止这种情况发生。

阅读我的答案,了解我是如何克服的$Z

答案1

一个不太重量级的解决方案是使用容器。安装 Docker 或 Podman,然后按照以下步骤操作eyoung100 的回答确定您想要的发行版,或者查找它论悔罪学

使用相同的 Fedora 36 示例,运行一个容器:

podman run -it fedora:36

您可以添加-v选项以使系统上的目录在容器内可用:

podman run -it -v ~/myproject:/myproject:z fedora:36

:z(仅当您使用 SELinux 时才添加)。

在容器中,安装gcc您需要的任何其他工具,构建您的项目(在 中/myproject),然后您将在共享的目录中找到您的文件。

答案2

我的解决方案

首先,我想我会被认为是一个纯粹主义者,因为如果一个包不在您的存储库中,或者无法从第三方存储库添加,您不应该尝试从头开始编译它或“强制它工作”,因为这样做会使你的包管理器短路。考虑到这一点,我提出了一个坚如磐石的解决方案


虚拟化是我们的朋友

我们需要一些工具和一些硬盘空间来实现这种方法。我会为您留出可用空间,但除此之外,请按照以下步骤操作:

  1. 安装虚拟盒子与你的包管理器
  2. 安装流浪汉与你的包管理器

笔记:我相信 Vagrant 将与 Hyper-V 和 docker 一起使用(参见斯蒂芬·基特的回答有关 docker 的帮助),但我选择了 VirtualBox,因为这是我首先学到的,如果需要,我可以在虚拟机中安装桌面以进一步配置虚拟机。

安装虚拟化助手后,我们可以继续。我继续:

  1. 收集需求 - 我是一名网络程序员,所以让我们收集客户的需求。为了我们的目的,我现在要填写$Z。使用上面问题标题中的示例问题 2,我们得到以下值:
    • $X = Fedora
    • $Y = 13.2.1-6.fc39
    • $Z = 12.x.x
  2. 总是使用以下句子作为您最喜欢的引擎中的搜索词: Which release of $X contains GCC $Z

因此使用我们的示例:哪个版本的 Fedora 包含 GCC 12。现在引用 Google:

将 Fedora 36 GNU 工具链更新至 gcc 12 和 glibc 2.35。 gcc 12 目前正在开发中,发布后将包含在 Fedora 36 中。 2022 年 2 月 16 日

  1. 让我们检查一下上面的版本 - 36 - 是否仍然受支持。在我们的搜索引擎中:
    $X 发布历史记录

这相当于我们示例中的 Fedora 发布历史记录,这给了我们Fedora Linux 发行历史。好吧,我们现在该怎么办?看起来 Fedora 36 不再受支持。正是出于这个原因,我们添加了 Vagrant。如果我们访问流浪云,我们可以搜索 Fedora 36,它会产生这些结果,并使用流浪文件,我们可以自定义完整的 VM 版本并使用 VM 开发我们的应用程序或网站,同时将项目文件保存在我们的主机系统上。

我选择这种方法的原因

使用虚拟化将您的开发环境与您日常使用的系统分开,并防止您犯下无法挽回的错误。我意识到这会花费一些额外的安装时间,但 Vagrant 只需要安装一次。只需在每次项目需求发生变化时创建 vagrantfile。 Vagrant 和虚拟化的学习曲线很小,如果在尝试弄清楚如何安装多个编译器时犯了错误,那么值得重新安装操作系统。

相关内容