使用比平台提供的GCC新版本所需的条件

What is needed to use a newer version of GCC than the platform provides

本文关键字:GCC 新版本 条件 平台      更新时间:2023-10-16

我正在考虑使用比我需要支持的一些平台(GCC 4.1)提供的更新版本的GCC(例如5.2)的可能性,因为我希望至少具有c++ 11的功能,甚至可能具有一些c++ 14的功能。我只是提供了一个可执行程序,而不是我希望平台用户能够链接的静态或共享库。

我能够编译GCC 5.2和Boost 1.59(我目前使用的唯一带有c++ API的库),并使其与可执行文件旁边的so一起工作,并在具有4.4的测试系统上向RPATH添加$ORIGIN。

但我不清楚我还需要做些什么,以确保一切正确/安全。我注意到libc, libm, libpthread等不是GCC构建的一部分,它仍然使用系统版本,就像许多其他第三方库(例如zlib, libpng等)一样。为了安全,我需要重建并分发所有这些东西吗?他们有一套标准的规则吗?

也想知道我是否应该静态链接一些东西,再看看规则是什么?例如,仅仅使用"-static"就会失败,因为它会寻找我在该系统上没有的静态pthread(并且我假设其他系统提供的库)。理想情况下,我想保持我的包的大小较小。

但我不清楚我还需要做些什么,以确保一切正确/安全。我注意到libc, libm, libpthread等不是GCC构建的一部分,它仍然使用系统版本,就像许多其他第三方库(例如zlib, libpng等)一样。为了安全,我需要重建并分发所有这些东西吗?他们有一套标准的规则吗?

在可执行文件和共享库上运行ldd,以确保它从正确的位置加载libstdc++libgcc_s(如果动态链接它们)。这是运行用g++构建的应用程序通常只需要的两个依赖项。

通常,您不需要提供您自己的带有C接口的库版本,除非您的应用程序需要具有不兼容api的新版本。

最近的GCC编译器有很多依赖项。

在一些发行版上,你可以要求它们:在Debian或相关的发行版上,你可能会要求aptitude build-dep gcc(如果你的/etc/apt/sources.list中有deb-src:),它会下载系统的gcc的构建依赖项(它可能与最新的GCC有很多共同的依赖项)。

否则,GCC源代码中包含一个contrib/download_先决条件脚本,应该很方便。

仔细阅读GCC构建过程。不要忘记在源代码树的之外编译它。您可能希望将--program-suffix=-5-mine传递给它的configure

当然,您还需要使用新构建的GCC构建编译(或交叉编译)代码所需的所有其他软件,包括binutils、gdb,也许还有一个C库

或者使用chroot(或一些容器 la docker)来安装较新的Linux系统…

我注意到libc, libm, libpthread等不是GCC构建的一部分,它仍然使用系统版本,就像许多其他第三方库(例如zlib, libpng等)一样。为了安全,我需要重建并分发所有这些东西吗?

。如果你在你想要部署到的系统上构建GCC,那么GCC二进制文件和共享库将取决于libc, libpthread等的系统版本。

如果您使用该GCC来编译您的软件,并在您的软件旁边部署新的libstc++.so.6(使用$ORIGIN以便找到它),那么它仍将使用这些库的系统版本。这正是应该发生的,也是你想要发生的。重新构建它们将一事无成,只意味着您将有更多的库与您的软件一起部署。

按照说明从源代码构建。如果你遇到问题,修改你的问题。

我认为有比自己编译GCC更简单的方法。[不幸的是,我从源代码编译了很多次后才发现:)]

例如,在Ubuntu中,有一个PPA用于预编译的GCC版本,这些版本还没有在官方存储库中。

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-5 g++-5
sudo update-alternatives 
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 20
sudo update-alternatives --config gcc
sudo update-alternatives --config g++