2017-08-17 224 views
3

我的软件可以在各种操作系统上编译,包括RHEL7。我有一个建立它在RHEL6上运行的请求。我的问题是,我的C++代码很大程度上依赖于gcc-4.4中没有的C++ 11功能,这是RHEL6中的一个。在RHEL6上编译最近的gcc:如何分发软件?

我看到有方法可以让更多最近的gcc版本在RHEL6上运行,例如Developer ToolSet。我毫不怀疑,我将能够为RHEL6构建我的软件。

但是,一旦用gcc-6编译,我需要提供哪些软件的二进制文件? gcc-6的C库? gcc-6的C++库?我应该将它们静态链接到我的二进制文件吗?最后,对于RHEL,我的软件打包到.rpm文件中,并安装在标准位置:/ usr/bin,/ usr/lib ...我将在哪里安装这些新的C和C++库文件在目标系统上? (显然不在/ usr/lib中,它们可能会干扰默认的!)

编辑:我的软件是一个共享对象,我想我可以静态链接C++库吗?但是该程序(我无法控制它)会使用我的共享对象。它可以使用其他版本的C++库吗?链接器不会找到很多重复的东西吗?看起来我打开一罐蠕虫...

编辑:是否有可能使用最新的gcc编译器与RHEL6第一版的标准C++库?

+1

我不是专家,但我听到很多人都乐于用[泊坞窗](https://www.docker.com/)。 –

回答

1

静态链接您的二进制文件与标准库绝对是最简单的解决方案。潜在的问题:

  • 然后成为负责当一个漏洞在图书馆找到一个(而不是你的用户负责保持修补他们的系统上的库)发布应用程序的新版本。
  • 这只有在的一切连接在一起成为一个单一的二进制。如果您的应用程序当前打包为一系列不同的共享对象,那么您并不希望将运行时库静态链接到每个共享对象中。

The Quantum Physicist笔记注释,集装箱解决方案,如Docker也可以是一个很好的(和易于维护的)解决方案。

解决应用程序打包新版运行时库的一般问题是一个非常有趣的问题,希望有人会很快解释如何去做。

+0

不幸的是,我的软件实际上是一个共享对象... –

3

您可以将您的应用程序与适当的动态链接版本的标准C++库一起分发。您不必将其放置在/ usr/lib中,但必须以可找到正确版本的库的方式链接您的应用程序(请参阅连接器的-rpath参数)。

最重要的是,您需要确保您的应用程序不使用glibc的新功能(或者将glibc的适当版本与应用程序一起发送)。确保最简单的方法是针对老版本的glibc构建所有内容(应用程序和更新的gcc)。而的最简单版本是基于旧版本的操作系统(但是使用新的编译器)。

+0

我不太熟悉Linux共享对象模型。在Windows上,如果应用程序使用运行时的一个版本并且链接的DLL使用另一个版本,则肯定会有潜在的麻烦。如果创建对象而另一个删除它,则这尤其成为问题。它取决于DLL/so的接口。 –

+0

@MartinBonner在Linux上,只有一个版本的库通常被加载,如果应用程序设法加载最新版本,它是黄金的,因为所有的库都会使用它,如果你以某种方式管理加载两个不同版本,你一定会遇到问题(不是潜在的),但通常不会发生 –

0

仅供参考 - WRT开发者工具集,如果你用它在RHEL 6编译,它将运行在两个RHEL 6的7

+0

Hi Mike。我的问题涉及我的共享对象的用户在RHEL 6上使用Developer Toolset编译:他/她是否必须在他/她的系统上安装Developer Toolset以编译他/她的程序并运行它,或者股票gcc-4.4足够了吗? –