RedHawk 2.0 二进制文件对 libboost 版本的依赖程度如何?

How dependent are RedHawk 2.0 binaries on libboost versions?

我有兴趣使用比 CentOS 6 附带的 gcc 4.4.7 更新的编译器。我需要使用 C++11 功能,因此需要 gcc 4.8+ 版本。我发现有一些 rpm 可以加载包含 gcc4.8.2 和相关所需库等的 devtoolset-2。我可以将编译器切换为使用 scl enable,这样就不会烧毁我的桥梁。我加载了它并用 RedHawk 2.0 尝试了它,它看起来很有效,但是 boost 库的头文件存在问题。 RedHawk 安装似乎使用 libboost,混合了 2011 年和 2009 年的 1.48 和 1.41。当前的提升是 1.60。

我还在 Ubuntu 上构建并安装了 RedHawk,当时有 gcc 4.8.4 和 libboost1.54。所以 RedHawk 显然可以使用较新的 gcc 和 boost,但我担心 CentOS 6 上的 RedHawk 二进制文件依赖于 boost 库版本。而且我没有看到安装更新的 boost 的方法,它允许我在 devtoolset 允许的情况下来回切换。

如果我切换到更新的 boost,我是否可能必须从源代码重建 RedHawk 2.0 而不是使用 rpms?

我相信如果您打算使用与系统默认安装版本不同的 boost 版本,则需要从源代码构建 REDHAWK。可能还有其他方法可以让它工作,但从源代码构建将是最干净、最直接的方法。

之所以需要这样做,原因之一是您构建的组件正在编译并 linking 针对核心框架。核心框架的 rpm 安装版本是 link 针对系统安装版本的 boost 所以你的组件也是 link 针对 boost 的系统安装,虽然你可以编译和 link 针对第二个版本的提升,这可能会导致难以调试的运行时问题。您可以使用 "ldd" 确认 link 二进制文件是什么。例如,最基本的组件 HardLimit link针对增强线程、正则表达式、系统、文件系统和序列化。

为了确认这是可能的,我从源代码构建并安装了最新的 boost (1.60.0),然后能够针对它构建 2.0.0 框架。我将 boost 1.60 库安装到 /usr/local 的默认位置,因此当我配置我的 REDHAWK 源代码构建时,我提供了:

./configure --with-boost=/usr/local --with-boost-libdir=/usr/local/lib

请注意,如果您安装了 xsd 4.0,该框架将声称它需要 3.3。 xsd 4.0 在 2.0 发布后发布,xsd3.3 从 epel 中删除。要解决这个问题,您可以简单地编辑 configure.ac 文件以不检查特定版本的 xsd 并重新运行重新配置脚本。 epel 中 xsd 的版本向后兼容,可以与 2.0.

一起使用

我用gcc/g++的系统安装版本构建了框架。如果您使用 g++ 的 scl 版本构建框架,则需要查看 this ticket

然后我构建了 bulkio,再次使用与上述相同的配置行,并再次使用系统安装的 gcc/g++ 版本。

最后,您可以安装 g++ 的 scl 版本,启用它们,并使用以下命令配置和构建支持 c++11 的组件:

./configure --with-boost=/usr/local --with-boost-libdir=/usr/local/lib CXXFLAGS='-g -O2 -std=c++11'

我选择构建 SigGen,运行 单元测试以确认操作。只需确保您的 boost 库安装在 LD_LIBRARY_PATH(在我的例子中是 /usr/local/lib)之前 运行.