【问题标题】:Building Boost with LSB C++ Compiler使用 LSB C++ 编译器构建 Boost
【发布时间】:2010-04-26 07:19:04
【问题描述】:

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

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

【问题讨论】:

  • LSB 什么时候成为编译器了?我认为这只是对应该在 Linux 发行版上安装和使用哪些库和实用程序的规范(以便其他库和实用程序可以依赖它们)。
  • Michael Aaron Safyan:LSB 项目提供了他们自己的 C++ 编译器,可以用来代替 GCC,并且应该生成与所有 Linux 发行版兼容的二进制文件。事实上,将这个编译器用于我自己的代码会产生很好的效果。但是,我的项目中使用的第三方库存在问题。
  • @Michael,LSB 是一组规范,但工作组还提供了帮助开发符合这些规范的程序的工具。见这里ldn.linuxfoundation.org/lsb/porting-lsb-demo 和这里linuxfoundation.org/collaborate/workgroups/…
  • @Pavel,感谢您提供的信息。这真的很酷。

标签: c++ linux gcc boost binary-compatibility


【解决方案1】:

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

  • 下载并安装 LSB SDK
  • 下载一个版本的 boost 并解压到 /opt/boost/boost_(我用的是 1.43)
  • 确保已安装 libbz2-dev。
  • 引导与
cd /opt/boost/boost_<version>
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu
  • 编辑/opt/boost/boost_&lt;version&gt;/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 的共享库,则需要。

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

【讨论】:

  • 很有趣,谢谢。目前我正在使用自动工具来解决二进制兼容性问题。我会保留您的答案以供将来参考。
【解决方案2】:

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 构建提升相关的内容,因此,如果您设法做到了,请分享您的经验,例如,作为您自己问题的答案。

【讨论】:

  • 我尝试构建 Boost 替换 g++ 文件,并带有指向 lsbc++ 的链接。结果是许多库的编译失败。我将尝试 GCC 4.3 版本,感谢您提供此信息。
  • @Alex,我希望除了替换链接之外,您还将lsbc++ 指向真正的编译器,因此它不会递归:-D。无论如何,您也可以尝试在 LSB 邮件列表中获得帮助:lists.linux-foundation.org/mailman/listinfo/lsb-discuss 邮件列表格式比 StackOverflow 更适合讨论带有错误日志的具体错误。
  • 使用 GCC 4.3 没有帮助,我仍然无法将 lsbc++ 编译器用于第三方库。但是,我使用 LSB Application Checker 得到了一些结果。通过将缺少的库添加到我的包中,我设法获得了 50 个 Linux 发行版中的 49 个与使用 Boost ASIO 库的程序的兼容性。有点成功...感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2022-07-15
  • 2011-11-09
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多