我正在尝试安装多个版本的 g++ 编译器以用于测试目的。
我希望能够安装g++ 4.9.3
、、和。5.1.0
5.2.0
6.1.0
我知道我能做到
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y;
sudo apt-get update -qq
sudo apt-get install g++-4.9, g++5.1, g++5.2, g++6
但在我的测试中,它们最终都使用了系统安装的标准库,即g++-4
-series 标准库。我之所以能分辨出来,是因为当我编译代码时,标准库并没有执行 C++11 标准要求它应该执行的一些操作,例如,std::string
移动构造函数没有被标记noexcept
。但在具有 gcc-6 标准库的 ubuntu-xenial 上,它被标记了,并且其他相关问题都得到了解决。
我可以看到 ubuntu 存储库中有名为libstdc++-4.8-dev
实例的软件包,但是当我安装较新的编译器时,它们似乎没有使用它们。
我也知道我可以从我的主目录中的源代码安装编译器,但构建它们需要很长时间,不幸的是我无法在短时间内完成travis-ci
。在 travis-ci 中,所有构建都会在一小时后超时。
有没有一种简单的方法可以配置从 ppa 安装的编译器以使用正确版本的 C++ 标准库,即它们发布的版本而不是系统默认版本?
有没有一种简单的方法,我可以使用 apt-get 将编译器二进制文件及其所有相关库安装到我的主目录中的文件夹中,而无需从源代码构建?
我已经发现这些说明,其中说我可以使用-rpath
标志或 specs 文件,或者调整LD_LIBRARY_PATH
,但我不确定应该设置哪些路径。另一个问题是,这不仅仅是动态链接器,ubuntu-toolchain-r/test
编译器似乎也在使用系统libstdc++
头文件,所以我需要以某种方式纠正它。
我目前的策略是,只下载源代码发布 tarball,并尝试摆弄配置标志,直到我能找到在不到 60 分钟内构建它的方法。一旦我成功构建一次,它就会出现在我的“缓存”目录中,这样我项目的未来构建就可以在不到 1 分钟的时间内获得该映像。
仅在使用 ubuntu-precise (12.04 LTS) travis 图像时才可使用“缓存”功能,因此我甚至不能在这里使用 trusty。
我的配置行当前是:
${GCC_SRC_DIR}/configure --prefix=${GCC_DIR} --disable-checking --enable-languages=c,c++ --disable-multilib --disable-bootstrap
我这样做主要基于这家伙的指示。
还有旧错误报告提到了这一点。
据我所知,该--disable-checking
选项没有真正记录在案,所以可能已经失效了。该--disable-bootstrap
选项已记录在案,希望它能防止我实际构建编译器三次如这里所述... 但不确定这有多大可能性可行。
make -j2 --quiet
此后我便开始实际构建。
现在使用更长的线:
${GCC_SRC_DIR}/configure --prefix=${GCC_DIR} --disable-checking --enable-languages=c,c++ --disable-multilib --disable-bootstrap --disable-libsanitizer --disable-libquadmath --disable-libgomp --disable-libssp --disable-libvtv --disable-libada --enable-version-specific-runtime-libs
答案1
配置 gcc-5.x:cd build-gcc-5.x/
../gcc-5.3.0/configure --prefix=/usr/local/gcc53 --program-suffix=53 --enable-languages=c,c++ --with-system-zlib --disable-multilib --disable-libstdcxx-pch
(需要sudo apt install zlib1g-dev
,如果--with-system-zlib
)
关于“60 分钟限制”:您可以在 55 分钟后退出终端,然后稍后继续make
。