我的理解是 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-essential
、fakeroot
和devscripts
。
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-x32
Wheezy 上不存在该包。这是通过进入debian/rules.defs
并删除所有提及 x32 来完成的。该文件由构建文件使用debian/rules
。
3)你也想改变debian/source/format
。由于某种原因,这是源格式 1。将其更改为版本3.0 (quilt)
。因此,将此文件的内容从 更改1.0
为3.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 最终将进入测试,但永远不会进入喘息状态,因此如果不添加存储库或手动构建它,您将无法安装它。