自动将 GCC 更新到更高版本,无需升级发行版

自动将 GCC 更新到更高版本,无需升级发行版

我的理解是 G++ 4.7.2 中的 C++11 支持不是很好(每次我尝试编译 C++ 代码时它都会给我一个警告,大概这些警告有充分的理由),所以我想我会尝试更新更新的东西。

我没有很多下载配额,所以我真的想限制我的下载量,所以我绝对不想升级 Debian stable (Wheezy) 或升级,build-essentials除非我真的需要。

是否有一个简单的命令可以让我使用apt-get最新的 GCC 版本(或任何具有完整 C++11 支持的版本),而不会对我的 aptitude 存储库做任何奇怪的事情?

我更希望答案以我可以运行的命令的形式出现,该命令将覆盖任何现有的安装,因为我仍在努力解决整个 Linux 安装过程。

答案1

包管理为您提供了一组“属于在一起”的包。试图欺骗它安装一组不属于您的发行版的新软件可能“效果不佳”。通常发生的情况是,您获得了一个巨大的后续软件包菊花链,您还需要升级这些软件包(例如“gcc 需要新的 glibc,新的 glibc 需要新的 binutils,新的 binutils 破坏了您的 gdb,因此您需要更新它” “, ETC)。

我发现保留现有安装的工具是一个更好的解决方案,然后构建我自己的 gcc、llvm+clang、gdb、lldb 或任何我认为需要更高版本的版本。通常,这可以毫无问题地工作,因为它安装在 /usr/local/{bin,lib,include,...} 中,而发行版工具安装在 /usr/{bin,lib,include,...} 中 - 所以如果你需要使用旧的(有时事实证明是这样的,例如你有一个较新的 gcc,不幸的是它无法编译项目 A - 甚至它本身) - 你可以使用 /usr/bin/ gcc 或编辑 $PATH 以不使用 /usr/local。

我安装了 Fedora-16,但使用 gcc 4.8.2(截至 3 月底的最新版本)和 clang 3.5 - 系统附带的默认编译器是 gcc 4.6.3 和 clang 2.9。 Clang 3.5 需要 C++11 兼容编译器,因此该项目需要 4.7 或 4.8。它工作得很好。 (但是新的 gcc 和 clang 破坏了旧的 gdb,使得符号无法按预期工作,所以我需要重建 gdb 或升级它)。

答案2

正确的方法是使用向后移植。看如何安装比 Debian 提供的软件更新版本的软件?为背景。不幸的是,无论这意味着什么,这都不是“自动的”。

我将在下面概述该过程。这个问题没有指定 gcc 版本,但 4.9 刚刚发布,所以我将限制自己描述如何反向移植它。每个向后移植都是不同的,并且有不同的问题;没有通用的食谱。

1)在某个子目录中下载 gcc 4.9 源代码,例如gcc-4.9

cd gcc-4.9
apt-get source gcc-4.9

2)然后

cd gcc-4.9-4.9.0/debian

3)然后将该debian/目录置于版本控制之下。我用的是水银。这是一个可选步骤,但在出现问题时很有用。

4)克隆这个Mercurial 存储库包含针对 Debian 打包文件的补丁存储库。您可以将其克隆到debian/目录中。 IE

gcc-4.9/gcc-4.9-4.9.0/debian$ hg clone https://bitbucket.org/faheem/gcc-4.9-debian-mq
gcc-4.9/gcc-4.9-4.9.0/debian$ patch -p1 < gcc-4.9-debian-mq/debian

patching file control
patching file rules.defs
patching file source/format

4) 现在您可以尝试构建。您需要安装一些软件包,例如build-essentialfakerootdevscripts

debuild -uc -us

如果您没有必要的构建依赖项,这可能会失败。所以,安装它们;debuild会告诉你缺少什么。使用该补丁,您应该能够成功解决对 wheezy 的所有依赖关系。

当此过程结束时,您将在目录的顶层看到 gcc debs,gcc-4.9它应该可以安装在 Wheezy 上。注意:在撰写本文时我尚未检查这一点 - 见下文。

注意:此补丁可能无法继续用于 gcc-4.9.作为参考,这是我正在修补的版本。这是继 2014 年 4 月 22 日发布 gcc 4.9 之后的第一个 Debian 软件包。

$ apt-cache policy gcc-4.9
gcc-4.9:
  Installed: (none)
  Candidate: 4.9.0-1
  Version table:
     4.9.0-1 0
         50 http://debian.lcs.mit.edu/debian/ unstable/main amd64 Packages

因此,我添加了一些有关如何生成补丁的注释,以便其他人可以自己执行此操作。请仔细阅读本文。特别是,即使您不打算制作自己的补丁,注释 (6)(多架构)也可能会引起您的关注。

1)首先,构建依赖关系不稳定,并且有不必要的限制。首先是削弱限制,使构建依赖关系得到满足。所以,首先尝试

debuild -uc -us

debuild会抱怨构建依赖项未安装。即使安装后,debuild也会抱怨版本不够新。因此,最简单的方法就是删除提到的版本号。

这方面的例子有各种binutils, libcloog-isl-dev, 和libmpc-dev

所以,例如改变

libmpc-dev (>= 1.0),

libmpc-dev,

在文件Build-Depends:顶部的行中debian/control,其中包含有关构建依赖项和二进制包的信息。一旦对所有有问题的软件包完成此操作,并且您已经安装了必要的构建软件包,Debian 构建系统就会运行。

2)您需要做的另一件事是删除对 x32。这不适用于 Wheezy。例如,libc6-dev-x32Wheezy 上不存在该包。这是通过进入debian/rules.defs并删除所有提及 x32 来完成的。该文件由构建文件使用debian/rules

3)你也想改变debian/source/format。由于某种原因,这是源格式 1。将其更改为版本3.0 (quilt)。因此,将此文件的内容从 更改1.03.0 (quilt).

仅当您将debian/目录置于版本控制之下时,这才是绝对必要的。由于我不会在这里详细讨论的原因,如果debian/处于版本控制之下,格式 1 会使构建失败。

4) gcc 在这个构建过程中运行了一个广泛的,我的意思是广泛的测试套件。如果您不希望它这样做,则可以通过更改以下行来禁用它rules.defs(如下所示# if you don't want to run the gcc testsuite, uncomment the next line

#with_check := disabled by hand

with_check := disabled by hand

我已经在我的补丁中禁用了测试套件。

5) Debian 构建系统开始运行后,该 control文件将立即被使用 control.m4.但是,仍然需要修改control,否则构建系统将拒绝继续。可以强制执行,但通常不建议这样做。

6) Multiarch 有一个恼人的功能,如果您更新软件包,安装的任何其他架构都需要保持相同的版本。我正在运行 amd64,这会影响我,因为我正在为 Skype 安装运行 i386 软件包。因此,如果您运行的是 amd64,请检查是否安装了相同的 amd64 和 i386 gcc 软件包。特别是,如果安装 4.9,libgcc1 软件包将会升级。这是无害的。

无论如何,在撰写本文时我还没有生成 i386 deb,因此无法检查 gcc 4.9 amd64 wheezy 安装。

更新:终于开始为 gcc 4.9 构建 i386 debs(在 i386 chroot 中使用schroot(参见如何在 64 位 Debian/Ubuntu 上运行 32 位程序?)),并且由于前面提到的 multilib 限制,将它们与 amd64 一起安装。我仍在测试,但 g++ 4.7 和 g++-4.9 都编译了我测试的代码。 debs的安装gcc 4.9并不完全简单,因为 4.7 和 4.9 的一些通用库也需要升级,例如libstdc++6.

我有兴趣听取其他人关于此事的报告。如果有人需要帮助调整 gcc 4.9 更高版本/发行版的补丁,请在此处发表评论告诉我。

答案3

恐怕是不可能的,或者至少,不值得。您可以执行以下操作:

  • 使用来自存储库的较新的 g++ 设置 chroot 环境。debootstrap 应该可以帮助你。
    • 优点:不影响您的安装。它也可以自动化。
    • 缺点:正确设置 chroot 环境有时并不简单。时间。
  • 自己构建软件包(向后移植)
    • 优点:个性化程度高。无需浪费硬盘空间
    • 缺点:每次都需要重新构建,所以不是自动的。您的环境被破坏的可能性更高。
  • 使用虚拟机:
    • 优点/缺点:与 chrooted 解决方案相同,只是两个系统与内核完全分离。

答案4

GCC 4.9 位于 debian sid 中​​。要安装它,您需要将不稳定的存储库添加到您的存储库中sources.list,并安装它以及它需要安装的任何先决条件。 4.9 最终将进入测试,但永远不会进入喘息状态,因此如果不添加存储库或手动构建它,您将无法安装它。

相关内容