在Ubuntu上获取和安装gcc/g++ 4.9版本?

如何安装最新版本的gcc和g++?
我正在使用各种C++11和C++1y的特性,这就是为什么我需要它们的原因。

1@muru 除了我的问题是几个月前提出的。所以他的是我的重复。 - A T
1重复独立于时间?- 这是一个奇怪的政策。- 而且有点名不副实? - A T
此外,我认为对我的问题的回答在质量和多样性方面都比他的更高。投票数也是可比的。因此,我呼吁将他的合并到我的问题中,而不是相反。 - A T
7个回答

你可以从Ubuntu Toolchain PPA安装接近上游版本的GCC:https://wiki.ubuntu.com/ToolChain#PPA_packages
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9

在Ubuntu 14.04上进行了测试。

4我有Ubuntu 14.04,但对我来说没有起作用。你是不是漏掉了一步?我在https://launchpad.net/~ubuntu-toolchain-r/+archive/test上没看到g++-4.9。 - test
测试,我刚才在Docker容器中检查了一下。 - Vladimir Rutsky
1测试,应该可以工作:https://gist.github.com/rutsky/bc40c6b4bee0ab5f9ee4 - Vladimir Rutsky
我认为在这里列出的https://launchpad.net/~ubuntu-toolchain-r/+archive/test软件包是源代码包,其中包括gcc-4.9,从中构建g++-4.9软件包。您可以确保.deb文件在此处:http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu/pool/main/g/gcc-4.9/ - Vladimir Rutsky
谢谢,我按照你的指示在你的要点中解决了问题。我非常感激。 - test
9但在12.04版本,它对我来说无效:E: 无法找到软件包gcc-4.9 E: 无法按正则表达式'gcc-4.9'找到任何软件包 看起来12.04特定地不受此存储库支持,即使较新和较旧版本的Ubuntu都受支持。 - Nickolai Leschov
@NickolaiLeschov 你找到了强制安装的解决办法吗?我也遇到了同样的问题。 - mavam
1@Matthias 看起来 gcc-4.9 只适用于 Ubuntu 14.04。对于其他版本,最新可用的版本是 gcc-4.8。我搜索了一下,没有找到适用于早期版本 Ubuntu 的 gcc-4.9 的 ppa。总有一种从源代码编译的选择,但从阅读说明中我得出结论,这对像我这样没有经验的人来说是一个令人望而生畏的过程,因此放弃了这个想法。 - Nickolai Leschov
1在添加PPA后,不要忘记运行apt-get update - Vincent Robert
9作为最后一步,我发现有必要将符号链接/usr/bin/g++的目标从/usr/bin/g++-4.8更改为/usr/bin/g++-4.9。...或者保持不变,直接调用g++-4.9。最后:std::regex支持。 - DavidO
@DavidO 谢谢你!你帮我省了不少功夫。 - quant
3@DavidO - 你应该可以使用替代系统来避免直接编辑符号链接。请参考http://askubuntu.com/q/26498/5682。 - Josh Kelley
1在Ubuntu 14.04上运行得非常好。 - Mythul
如果你只是需要编译一个源代码包,你可以设置环境变量 CXX=/usr/bin/g++-4.9 来指定你的配置脚本应该使用哪个编译器。这样,你就可以通过 CXX=/usr/bin/g++-4.9 ./configure --prefix=/usr/local 来配置脚本。这样一来,你就不需要去处理备选项或符号链接了。 - walkeros
@NickolaiLeschov 你首先需要安装 gcc-4.9。请参考这篇帖子:http://askubuntu.com/a/581497/378854 - phil294
软件包 'g++-4.9' 没有可安装的候选项。请更新。 - Jon Deaton

简介

授人以鱼不如授人以渔等等。

如何以apt友好的方式在本地存储库中构建源包并提供服务。只要满足依赖关系,这将适用于任何发行版。此方法不需要您为每个软件包安装构建依赖项并污染计算机的额外软件包,这将让您随着debian experimental中软件包更新而保持同步。这只需要几分钟的时间进行一次操作,然后可以重复使用它来重新构建您需要的任何软件包,而无需依赖其他人打包ppa或下载一堆不同的.deb文件。

与从debian拉取裸.deb文件相比,构建的好处是这将构建软件包以针对您发行版中的软件包,这些软件包的版本/修订版本可能与debian发行版的构建依赖项不同。这或多或少是反向移植软件包的过程。您还可以使用任何ubuntu发行版来构建针对任何其他发行版(在这种情况下,目标是指针对标准存储库软件包进行构建)的软件包,而不会有任何麻烦。

基本-如何构建deb文件

(不适用于ppa上传-这需要来自launchpad的官僚要求

可能需要的包: packaging-dev (会引用其他包,包括build-essential pubilder ubuntu-dev-tools)
  1. 设置 pbuilder(这样你可以在 chroot 中构建软件包,而不会污染系统的构建依赖包)

    • sudo pbuilder create
    • 如果你想为特定的发行版构建(pbuilder 使用 chroot 中的构建系统版本),你可以使用 pbuilder-dist [precise/oneric/trusy/etc...] create
  2. 获取 Debian 源码

    • pull-debian-source gcc-4.9 [4.9.0-6] 特定的 Debian 修订版是可选的,但如果你想获取实验性/不稳定/测试/稳定的修订版,它可能会有用
    • 你也可以通过将其添加到 sources.list 作为 deb-src 并使用 sudo apt-get src从特定的 Ubuntu 发行版中获取
  3. 构建软件包

    • sudo pbuilder build gcc-4.9_4.9.0-6.dsc
    • 在下载的文件中有一个 .dsc 文件,对于最新的 gcc,它是 gcc-4.9_4.9.0-6.dsc,它是一个软件包描述符文件。 .orig.tar.[gz/xz] 是源代码 tarball。
  4. 创建本地 Apt 仓库

    • mkdir /方便的/存放/仓库的位置
    • cp /var/cache/pbuilder/result/* /路径/to/仓库
    • (假设你在仓库目录中) apt-ftp archive packages . > Packages
    • (这是其中一种方法) sudo echo "deb [trusted=yes] file:/本地/仓库/Packages ./" > /etc/apt/sources.list.d/gcc-repo.list
    • 注意,你也可以使用从任何地方下载的 .deb 文件来执行此步骤(跳过步骤 1-3)
  5. 安装

    • apt-get update; apt-get install gcc-4.9 g++-4.9

额外技巧

简单的回溯依赖

在构建软件包时,使用自编译的软件包来满足依赖关系。(我已经设置了文件夹~/pbuilder ~/pbuilder/precise_local(用于存放精确版本的本地软件包仓库)和~/pbuilder/precise_hooks(用于挂钩脚本))

将以下内容添加到您的~/.pbuilderrc文件中

OTHERMIRROR="deb [trusted=yes] file:///home/user/pbuilder/precise_local ./"

BINDMOUNTS="/home/user/pbuilder/precise_local" 

HOOKDIR="/home/user/pbuilder/precise_hooks"

EXTRAPACKAGES="apt-utils"

在`precise_hooks`中创建一个名为`D05local`的文件(按照典型的Unix/Linux方式,前缀`D`表示脚本被挂钩的时间,`05`是自我设定的名称排序,`local`只是名称,如果只有一个挂钩,它叫什么不重要,只要`D`是前缀)。
这个脚本只有一行代码:
`(cd /home/user/pbuilder/precise_local ; apt-ftparchive packages . > Packages)`
现在,放置在`precise_local`中的任何软件包都将满足构建依赖关系。当回溯需要回溯其依赖项的软件包时,这非常有用,可以在本地构建依赖树。

虚拟机解决方案

为了以更清晰的方式进行操作,可以使用虚拟机镜像或LXC容器来隔离这个混乱。

应用自定义补丁

大多数Debian软件包可以使用`quilt`来应用自定义补丁,quilt补丁可以使用大多数版本控制系统的差异(参见:使用quilt)。
有一个额外的步骤,你必须重新构建 .dsc.debian.tar.gz。我知道的最干净的方法是使用 bzr-builddeb,在我看来它的成功率最高(与 git-build-package 和其他辅助脚本相比),而且比直接调用 debuild 要更清洁一些(bzr = bazaar canonical 的版本控制系统)。
  1. sudo apt-get install bzr-builddeb
  2. (假设已经解压了.orig.tar.gz.debian.tar.gz并将其放在其中
    • bzr init
    • bzr add
    • bzr commit
  3. (可选)
    • 修改debian/changelog
    • 将补丁添加到debian/patches/并修改debian/patches/series(quilt还有工具可以添加补丁或让您即时修改,请参阅文档)
    • bzr add debian/
    • bzr commit
  4. bzr builddeb -- -S -us -uc 这将重新构建源文件并保持未签名状态(PPA/发行版上传需要GPG签名,但对于私人本地仓库则不需要)
  5. cd ../build-area/ 从上述第3步继续。
这里的步骤1-4基本上就是你需要上传到PPA的内容(它们不接受二进制文件),但你需要一些步骤来满足launchpad的官僚主义要求(这个答案提供了解释,这个有一些链接)。

1真的很酷 :-) - Marcos Roriz Junior
14.04版本中缺少一些步骤。执行sudo pbuilder build gcc-4.9_4.9.0-6.dsc会失败。 - jfs

安装
sudo su -
apt-get install build-essential
add-apt-repository ppa:ubuntu-toolchain-r/test
apt-get update
apt-get install gcc-4.9 g++-4.9 cpp-4.9

之后,如果您检查gcc的版本,您会发现旧版本。
gcc --version

所以我们可以用简单的符号来修复它。
cd /usr/bin
rm gcc g++ cpp
ln -s gcc-4.9 gcc
ln -s g++-4.9 g++
ln -s cpp-4.9 cpp

或者

你可以使用update-alternatives进行更新

// 实际上,我尝试过使用符号链接,我知道这样会起作用,但你也可以使用符号链接来避免问题 // 如果我错了,请纠正我

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 40 --slave /usr/bin/gcc gcc /usr/bin/gcc-4.9
update-alternatives --config gcc
update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-4.9 40 --slave /usr/bin/cpp cpp /usr/bin/cpp-4.9
update-alternatives --config cpp
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9
update-alternatives --config g++

或者,你可以只是编译与。
/usr/bin/gcc4.9 filename.c

gcc-4.9就像gcc-4.8的"ubuntu 14.04 gcc",它们之间没有太大区别。

proof


3gcc 4.9和4.8相比有很大的差异,而且它支持openmp 4.0。 - user314965
请问您能帮我查一下差价吗? - hwez
1对于初学者来说,它具有C++14(即c++1y)的支持。 - Drew Noakes
1关于gcc 4.9功能的文章:http://isocpp.org/blog/2014/04/gcc-4.9.0 - Kurt Krueckeberg

Debian 提供了一个软件包:https://packages.debian.org/jessie/gcc-4.9 - 为了避免与 Ubuntu/Debian 的兼容性问题,请不要将其添加到您的 sources.list 中。
相反,只需下载所有这些文件即可:
binutils_2.25-5_amd64.deb
cpp_4.9.2-2_amd64.deb
g++_4.9.2-2_amd64.deb
gcc_4.9.2-2_amd64.deb
gcc-4.9-base_4.9.2-10_amd64.deb
libasan1_4.9.2-10_amd64.deb
libatomic1_4.9.2-10_amd64.deb
libcilkrts5_4.9.2-10_amd64.deb
libgcc1_4.9.2-10_amd64.deb
libgcc-4.9-dev_4.9.2-10_amd64.deb
libgomp1_4.9.2-10_amd64.deb
libitm1_4.9.2-10_amd64.deb
liblsan0_4.9.2-10_amd64.deb 
libmpfr4_3.1.2-2_amd64.deb
libquadmath0_4.9.2-10_amd64.deb
libstdc++-4.9-dev_4.9.2-10_amd64.deb
libstdc++6
libtsan0_4.9.2-10_amd64.deb
libubsan0_4.9.2-10_amd64.deb

从Debian的服务器上,例如:

http://ftp.us.debian.org/debian/pool/main/b/binutils/binutils_2.25-5_amd64.deb

然后安装它们,例如:$ for package in *.deb; do sudo dpkg --install "$package"; done [更简单的方法是运行这个bash循环几次,直到所有依赖都被覆盖,而不是记住你下载它们的顺序!]

两个链接都失效了... - Raghav RV
现在已经不重要了,新的Ubuntu版本都有比4.9更高的gcc版本。 - A T
这个问题是关于在Ubuntu上安装g++4.9的...并不是特别针对其中一个"新的Ubuntu"... ;) - Raghav RV
好的 @RaghavRV,我已经更新了所有部门名称和URL。 - A T

目前(20141102)添加PPA并调用上述命令apt-get install gcc-4.9 g++-4.9 cpp-4.9将会打印出一系列建议的软件包。安装除了libvtv0-dbg(存在依赖冲突)之外的所有软件包:

apt-get install gcc-4.9 g++-4.9 cpp-4.9 gcc-4.9-locales g++-4.9-multilib libstdc++6-4.9-dbg gcc-4.9-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan1-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libquadmath0-dbg lib32stdc++6-4.9-dbg libx32stdc++6-4.9-dbg

如果你对-dbg包不感兴趣,可以跳过它们,然后执行apt-get dist-upgrade --auto-remove命令。最后一步将基本上用gcc-4.9替换你的gcc-4.8(但不会卸载旧版本),同时还会引入最新的Fortran编译器。

我不得不强制安装gcc-4.9-base软件包的版本,以解决您发布的错误信息。然后安装就成功了。
sudo apt-get install gcc-4.9-base=4.9.2-0ubuntu1~14.04

现在你可以做常规的事情了。
sudo apt-get install gcc-4.9

在我的情况下,我不得不强制使用一个特定版本的libstdc++6,这是一个依赖项。由于某种原因,它想要使用一个旧版本,而它认为这是一个更新的版本,所以如果不强制,它就无法升级。 - Emre

安装GCC GNU 4.9
sudo add-apt-repository ppa:ubuntu-toolchain-r/test

sudo apt-get update

sudo apt-get install gcc-4.9

从默认应用程序列表中删除先前的gcc版本(如果已存在)
sudo update-alternatives --remove-all gcc

将GCC 4.9设置为系统的默认编译器。
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20

sudo update-alternatives --config gcc

最新的更新GCC 4.9.1是GCC 4.9分支的错误修复版本,其中包含了对GCC 4.9.0中的回归和严重错误的重要修复。与上一个版本相比,已经修复了超过88个bug。此外,GCC 4.9.1版本还支持OpenMP 4.0在Fortran中的使用,而不仅仅是C和C++。
注意:在Ubuntu 14.04 LTS上进行过检测。