5

我想使用来自 Linux 标准库http://www.linuxfoundation.org/collaborate/workgroups/lsb的 LSB C++ 编译器构建我的程序。程序依赖于 Boost 库,使用 gcc 4.4 版本构建。编译失败。是否可以使用 LSB C++ 编译器构建 Boost 库?或者,是否可以使用一些旧的 gcc 版本构建 Boost 库,推荐什么版本?我的最终目标是让我的可执行文件和第三方 Boost 库在大多数 Linux 发行版上运行。

一般来说,可以做些什么来获得更好的 Linux 发行版的二进制兼容性,开发依赖于 Boost 库的 C++ 闭源应用程序?

4

2 回答 2

6

我最近接到电话要这样做,如果它对其他人有用,这些是我遵循的步骤:

  • 下载并安装 LSB SDK
  • 下载一个版本的 boost 并解压到 /opt/boost/boost_<version> (我用的是 1.43)
  • 确保已安装 libbz2-dev。
  • 引导与
cd /opt/boost/boost_<version>
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu
  • 编辑/opt/boost/boost_<version>/project-config.jam并添加行
using gcc : : /opt/lsb/bin/lsbc++ : <cflags>-U_GNU_SOURCE <cxxflags>-U_GNU_SOURCE ;

文件顶部附近。请注意,如果您在 bjam 从中读取其配置的其他文件之一中有 using 声明,这将失败,您可以传递--debug-configuration以了解它正在读取哪些文件。

./bjam cflags=-fPIC cxxflags=-fPIC linkflags=-fPIC install

我没有尝试让 python 或 MPI 库工作,也没有尝试让 ICU 使用 boost.regex 库。后者可能是使用 LSB 工具集构建 ICU 库的静态版本的情况。

-fPIC对于 32 位 Linux 不是绝对必要的,但如果要将静态库链接到 64 位 Linux 的共享库,则需要。

最终结果应该是 in 中的二进制文件/opt/boost/lib和 in 中的标头/opt/boost/include,显然您可以修改前缀以适合您自己的偏好。在将所有代码移植到 LSB 之前,我还有大量工作要做,因此我无法报告认证过程的进展情况。

于 2010-07-23T11:00:02.787 回答
3

LSB C++ 编译器实际上并不是一个编译器。lsbc++可执行文件是安装在系统上的 GCC 编译器的包装器(实际的编译器可以通过选项控制)--lsb-cxx。您很可能会侵入 boost 构建系统,以便它调用 LSB 包装器而不是本机gcc编译器。

因此,可能出现的问题很可能不是 LSB 编译器无法编译语言结构,而是存在一些链接问题。

例如,LSB 编译器默认丢弃任何链接代码的共享库,除非它们属于 LSB。如果 BOOST 依赖此类库,这可能会导致链接错误。这可以通过LSBCC_SHAREDLIBS环境变量进行控制,但您应该确保将这些库与您的产品一起提供。

另一个问题是 LSB 落后于 GCC 编译器版本(并且 BOOST 可能会爬到编译器的所有黑暗角落)。据我所知,GCC 4.4 没有经过充分测试,所以你最好用 4.3 编译器试试。

并且 Google 似乎没有找到任何与使用 LSBCC 构建提升相关的内容,因此,如果您设法做到了,请分享您的经验,例如,作为您自己对问题的回答。

于 2010-04-26T08:12:54.720 回答