【问题标题】:Building Boost on Linux - library names在 Linux 上构建 Boost - 库名称
【发布时间】:2009-11-20 07:46:44
【问题描述】:

我正在尝试构建一个依赖于Boost 的应用程序。因此,我将 Boost 1_41_0 下载到我的 Linux 机器上,并按照 Boost 站点上针对 Unix 变体的说明进行操作, http://www.boost.org/doc/libs/1_41_0/more/getting_started/unix-variants.html.

他们基本上建议我运行 ./bjam install,我照做了。构建成功完成。但是,库名称似乎与上述文档中描述的 Boost 命名约定以及我正在尝试构建的应用程序的 makefile 中指定的内容不匹配。

我注意到我可以为 bjam 指定很多选项,我尝试使用这些选项,但无论发生什么,我似乎都无法完全正确。我的理解是库应该进入 $BOOST_ROOT/lib 目录。这是库出现的地方,但命名为:

libboost_thread.a
libboost_thread.so
libboost_thread.so.1.41.0

我希望它们被命名为 libboost_thread-gcc41-mt-d-1_41_0 或类似名称。

我确实尝试了 ./bjam --build-type=complete --layout=tagged 并且我看到了:

libboost_thread.a
libboost_thread-mt.a
libboost_thread-mt-d.a
libboost_thread-mt-d.so
libboost_thread-mt-d.so.1.41.0
libboost_thread-mt-s.a
libboost_thread-mt-sd.a
libboost_thread-mt.so
libboost_thread-mt.so.1.41.0
libboost_thread.so
libboost_thread.so.1.41.0

所以,我不确定我是否应该只创建我的 -L 目录?是否有任何文档可以更详细地描述这一点?

【问题讨论】:

    标签: linux boost building


    【解决方案1】:

    名称在 1.40.0 中已更改 - 请参阅 release notes

    构建系统

    库的默认命名 类 Unix 环境现在匹配 系统约定,而不是 包括各种装饰品。

    他们可能忘记在构建文档中更新这部分。

    【讨论】:

      【解决方案2】:

      这里有两个变量。首先是“安装”与“阶段”(默认)。 “安装”将库和头文件复制到一个目录中——默认情况下是 /usr/local,然后你可以删除源代码树。 "stage" 将库放到 "stage/lib" 中,你应该添加 "-L /stage/lib -I " 标志。

      其次是--layout=versioned 和--layout=system。看起来你已经发现了他们所做的事情,事实上,系统自 1.40 以来就是默认的。入门指南没有提到这一点,我添加了一个操作项来更新它。理想情况下,您应该与应用程序的作者交谈以使用 boost 库的系统命名。如果这不可能,那么使用 --layout=versioned 构建是唯一的选择。

      【讨论】:

        【解决方案3】:

        来自http://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html#library-naming 的 Boost 文档,约定是:

        -mt 线程标签:表示该库是在启用多线程支持的情况下构建的。没有多线程支持的库可以通过缺少 -mt 来识别。

        -d ABI 标记:对影响库与其他编译代码的互操作性的细节进行编码。对于每个这样的功能,标签中都会添加一个字母:

        Key 在以下情况下使用此库: s 静态链接到 C++ 标准库和编译器运行时支持库。 g 使用标准和运行时支持库的调试版本。 y 使用 Python 的特殊调试版本。 d 构建代码的调试版本。 p 使用 STLPort 标准库,而不是编译器提供的默认库。 n 使用 STLPort 已弃用的“本机 iostreams”功能。

        例如,如果您构建代码的调试版本以在“本机 iostreams”模式下与静态运行时库和 STLPort 标准库的调试版本一起使用,则标记将为:-sgdpn。如果以上都不适用,则省略 ABI 标签。

        【讨论】:

        • 如何构建具有多线程支持的 Boost? Boost 的Installation 没有提及。
        • 在构建 boost 时,使用:./b2 --build-type=complete --layout=versioned 这将生成每个库的每个版本,包括多线程的。
        • 感谢 Riot。从 Stack Overflow 上的 other discussions 看来,Boost 默认是多线程的。所以如果我执行./b2,那么我会得到多线程而没有装饰。不是这样吗?
        • 我相信 - 但如果您想完全控制包含和不包含的内容,我建议使用 --build-type=complete 和 --layout=versioned 然后简单地选择那些构建的库您实际希望包含的内容。在这种情况下没有歧义,特别是如果默认行为将来发生变化。
        猜你喜欢
        • 1970-01-01
        • 2011-05-30
        • 1970-01-01
        • 2012-08-23
        • 2019-06-15
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        相关资源
        最近更新 更多