我正在研究使用更新版本的GCC(例如5.2)的可能性,而不是我需要支持的一些平台(GCC 4.1),因为我希望至少具有C ++ 11功能,甚至可能是一些C ++ 14的东西。我只提供一个可执行程序,而不是静态或共享库,我希望平台用户能够与之链接。
我能够编译GCC 5.2和Boost 1.59(我目前使用的唯一一个带有C ++ API的lib)并且让它与那些放在可执行文件旁边的文件一起工作,并在测试系统上向RPATH添加$ ORIGIN。有4.4。
但我不清楚我还需要做什么,以确保一切正确/安全。例如我注意到libc,libm,libpthread等不是GCC构建的一部分,它仍然使用系统版本,就像许多其他第三方库(例如zlib,libpng等)一样。我需要重建和分发所有那些安全吗?他们是一套标准的规则吗?
还想知道我是否应该静态地链接一些事情以及规则是什么?例如只是使用“-static”失败,因为它寻找我在该系统上没有的静态pthread(我假设其他系统提供的库)。理想情况下,我希望保持包裹的大小。
答案 0 :(得分:3)
但我不清楚我还需要做什么,以确保一切正确/安全。例如我注意到libc,libm,libpthread等不是GCC构建的一部分,它仍然使用系统版本,就像许多其他第三方库(例如zlib,libpng等)一样。我需要重建和分发所有那些安全吗?他们是一套标准的规则吗?
在您的可执行文件和共享库上运行ldd
,以确保它从正确的位置加载libstdc++
和libgcc_s
,如果您动态链接它们。这些是运行使用g ++构建的应用程序通常只需要的两个依赖项。
通常,您不需要使用C
接口提供自己的库版本,除非您的应用程序需要具有不兼容API的较新版本。
答案 1 :(得分:2)
最近的GCC编译器有很多依赖项。
在某些发行版上,你可以要求它们:在Debian或相关的上你可能会/etc/apt/sources.list
(如果你的gcc
中有--program-suffix=-5-mine
),它会下载系统的构建依赖关系configure
(可能与最新的GCC有很多共同的依赖关系。)
否则,GCC源代码包含一个contrib/download_prerequisites脚本,应该很方便。
仔细阅读GCC building procedure。不要忘记在源代码树的外部编译它。您可能希望将chroot
传递给CSS
当然,您还需要构建使用新构建的GCC编译(或交叉编译)代码所需的所有其他软件,包括binutils,gdb,也许还需要C库
或者使用JQuery
(或某个容器àladocker)来安装较新的Linux系统......
答案 2 :(得分:2)
我注意到libc,libm,libpthread等不是GCC构建的一部分,它仍然使用系统版本,就像许多其他第三方库(例如zlib,libpng等)一样。我需要重建和分发所有那些安全吗?
没有。如果在要部署的系统上构建GCC,那么GCC二进制文件和共享库将取决于libc,libpthread等的系统版本。
如果您然后使用该GCC编译您的软件,并在您的软件旁边部署新的libstc++.so.6
(使用$ORIGIN
以便找到它),那么它仍将使用这些软件的系统版本库。这究竟应该发生什么以及你想要发生什么。重建它们将无济于事,只是意味着您可以在软件旁边部署更多库。
答案 3 :(得分:1)
按照指示从源代码构建。如果您遇到问题,请修改您的问题。
答案 4 :(得分:0)
我认为有一种更简单的方法可以自己编译GCC。 [不幸的是我在从源代码编译它之后想出来了很多次:)]
例如在Ubuntu中,预编译的GCC版本有一个PPA,而官方存储库中还没有。
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++