问题 在Linux上构建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目录?有没有更详细地描述这个的文件?


11603
2017-11-20 07:46


起源



答案:


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

构建系统

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

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


7
2017-11-20 07:56





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

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


2
2017-11-20 20:25





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

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

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

密钥使用此库时:
静态链接到C ++标准库和编译器运行时支持库。
g使用标准和运行时支持库的调试版本。
使用Python的特殊调试版本。
d构建代码的调试版本。
p使用STLPort标准库而不是编译器提供的默认库。
n使用STLPort不推荐使用的“本地iostreams”功能。

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


1
2018-02-22 07:54



如何构建具有多线程支持的Boost? Boost的 安装 没有提到它。 - jww
构建boost时,使用:./ b2 --build-type = complete --layout = versioned这将生成每个库的每个版本,包括多线程库。 - Riot
谢谢骚乱。从 其他讨论 在Stack Overflow上,默认情况下Boost似乎是多线程的。所以,如果我表演 ./b2,然后我得到没有装饰的多线程。那不是这样吗? - jww
我相信 - 但如果你想完全控制什么是和不包括在内,我建议使用--build-type = complete和--layout = versioned,然后只选择那些你真正希望包含的构建库。在这种情况下没有歧义,特别是如果将来默认行为发生变化。 - Riot


答案:


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

构建系统

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

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


7
2017-11-20 07:56





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

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


2
2017-11-20 20:25





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

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

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

密钥使用此库时:
静态链接到C ++标准库和编译器运行时支持库。
g使用标准和运行时支持库的调试版本。
使用Python的特殊调试版本。
d构建代码的调试版本。
p使用STLPort标准库而不是编译器提供的默认库。
n使用STLPort不推荐使用的“本地iostreams”功能。

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


1
2018-02-22 07:54



如何构建具有多线程支持的Boost? Boost的 安装 没有提到它。 - jww
构建boost时,使用:./ b2 --build-type = complete --layout = versioned这将生成每个库的每个版本,包括多线程库。 - Riot
谢谢骚乱。从 其他讨论 在Stack Overflow上,默认情况下Boost似乎是多线程的。所以,如果我表演 ./b2,然后我得到没有装饰的多线程。那不是这样吗? - jww
我相信 - 但如果你想完全控制什么是和不包括在内,我建议使用--build-type = complete和--layout = versioned,然后只选择那些你真正希望包含的构建库。在这种情况下没有歧义,特别是如果将来默认行为发生变化。 - Riot