我的软件可以在各种操作系统上编译,包括 RHEL7。我请求将其构建为在 RHEL6 上运行。我的问题是我的 C++ 代码很大程度上依赖于 C++11 功能,而 gcc-4.4(RHEL6 附带的功能)中不存在这些功能。不支持 nullptr、auto、lambda,代码中有很多。
我已经看到有一些方法可以让更新的 gcc 版本在 RHEL6 上运行,例如 Developer ToolSet。我毫不怀疑我能够为 RHEL6 构建我的软件。
但是,一旦使用 gcc-6 等进行编译,我必须为软件的二进制文件提供什么? gcc-6的C库? gcc-6 的 C++ 库?我应该将它们静态链接到我的二进制文件吗?
最重要的是,我的软件被打包成 .rpm 文件,并安装在标准位置:/usr/bin、/usr/lib ...我将在目标系统上的哪里安装这些新的 C 和 C++ 库文件? (显然不在 /usr/lib 中,它们可能会干扰默认的!)
编辑:我的软件是共享对象,我想我可以静态链接C++库吗?但是使用我的共享对象的程序(我无法控制它)又如何呢?它可以使用另一个版本的 C++ 库吗?链接器不会发现很多重复项吗?看来我要打开一罐蠕虫......
编辑:是否可以将更新的 gcc 编译器与 RHEL6 的标准 C++ 库一起使用?
编辑:请注意,共享对象具有纯“C”接口(标准化)。
答案1
我将在目标系统上的哪里安装这些新的 C 和 C++ 库文件? (显然不在 /usr/lib 中,它们可能会干扰默认的!)
相反,您将安装这些新库/usr/lib/
(或目标系统上的默认值;在我的 Debian 上,它们将进入
/usr/lib/x86_64-linux-gnu/
和/lib/x86_64-linux-gnu/
)。你需要关心路径-s。
我的软件是共享对象,我想我可以静态链接C++库吗?
这可能不适用于共享对象(但可以适用于可执行文件;然后您可以静态链接libstdc++
和动态链接libc.so
)。但是,共享对象可以与其他共享库链接。请注意,如果您提供 C++11 库,您的用户需要 C++11 编译器(除非您设计很小心您的库只有 C 兼容的 API)。
您可能会发布一些头文件并且应该利用pkg 配置因此发送适当的.pc
文件。
考虑阅读程序库操作方法,C++ dlopen 迷你操作指南和德雷珀的如何编写共享库纸。
是否可以将更新的 gcc 编译器与 RHEL6 的标准 C++ 库一起使用?
不;标准 C++ 库与 C++ 编译器密切相关(并且可能具有不同的 ABI)。
顺便说一句,我强烈建议您提供库的源代码,也许可以使其成为一些自由软件。然后,您可以向从事古老 Redhat 发行版的社区寻求帮助,以正确打包您的库。
请注意,您的库可能有许多其他依赖项。例如,如果它是一个 GUI 库,它可能会使用其他资源(如字体或图像)。