在Linux上构建Boost - 库名称

11
我正在尝试构建一个依赖于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目录设置为舞台?有没有更详细描述这一点的文档?

3个回答

7

名称已在1.40.0中更改 - 请参见发行说明

构建系统

Unix类环境中库的默认命名现在与系统约定相匹配,并且不包括各种装饰。

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


2
这里有两个变量。第一个是“install”和“stage”(默认值)。 “install”会将库和头文件都复制到目录中 - 默认为/usr/local,然后可以删除源代码树。 “stage”将库放置在“stage/lib”中,并且您应该添加“-L /stage/lib -I”标志。
第二个变量是--layout=versioned和--layout=system。看起来您已经发现了它们的作用,确实,自1.40以来,系统是默认设置。入门指南未提及此事,我已经添加了更新操作项。理想情况下,您应该与应用程序的作者交谈,以使用boost库的系统命名。如果不可能,那么使用--layout=versioned构建是唯一的选择。

1

http://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html#library-naming的Boost文档中可以看出,惯例是:

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

-d ABI 标签:编码影响库与其他已编译代码互操作性的详细信息。对于每个此类特性,将向标记添加一个单个字母:

Key     Use this library when:
s   静态链接到C++标准库和编译器运行时支持库。
g   使用标准和运行时支持库的调试版本。
y   使用特殊的Python调试构建。
d   构建您代码的调试版本。
p   使用STLPort标准库而不是编译器提供的默认标准库。
n   使用STLPort的弃用“本机iostreams”功能。
例如,如果您构建了一个调试版本的代码,用于与静态运行时库和STLPort标准库的调试版本一起使用,并且处于“本机iostreams”模式下,则标记为:-sgdpn。如果上述情况都不适用,则省略ABI标记。

1
如何构建支持多线程的Boost?Boost的安装指南中没有提到这一点。 - jww
2
在构建boost时,请使用以下命令: ./b2 --build-type=complete --layout=versioned 这将生成每个库的每个版本,包括多线程版本。 - Riot
1
感谢 Riot。从 Stack Overflow 上的其他讨论中(https://dev59.com/WXE95IYBdhLWcg3wft1w),似乎 Boost 默认是多线程的。因此,如果我执行 ./b2,那么我就可以获得没有装饰的多线程支持。这不是事实吗? - jww
2
我相信是这样的 - 但如果你想完全控制包含和不包含哪些内容,我建议使用--build-type=complete和--layout=versioned,然后只选择那些你真正希望包含的构建库。在这种情况下没有歧义,特别是如果默认行为在将来发生变化。 - Riot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接