b2 vs bjam 用于构建 Boost 库
Posted
技术标签:
【中文标题】b2 vs bjam 用于构建 Boost 库【英文标题】:b2 vs bjam for building Boost library 【发布时间】:2015-07-10 22:21:58 【问题描述】:我使用b2.exe
和bjam.exe
为VS2013、64 位架构构建了Boost。根据 Boost documentation,b2
必须超过 bjam
。我注意到的差异是:
-
来自 b2 的 .lib 文件的大小与相应 bjam 文件的大小不同。
使用 bjam 提供动态 .lib 库(没有提到 here 的 -s 标记),但它不提供要链接到的 .dll 文件(现在该怎么办?) ,而使用 b2 提供静态和动态库以及 .dll 文件。但是使用 b2 的问题是,它提供了两个动态 .lib 文件 - 一个以 boost_xxxx.lib 开头,另一个以 libboost_xxxx.lib 开头,两者的大小不同。 为什么会这样?
我还提到了使用构建选项--build-dir
的不同构建目录,但是这个目录有什么用?它由 .obj、.rsp 以及各自的 .dll 和 .lib 文件组成。这个目录可以删除吗?
这是我用来构建 Boost 的命令:
b2:
b2 toolset=msvc-12.0 --build-type=complete architecture=x86 address-model=32 install --build-dir=<build-dir> stage --stagedir=<stage-dir> -j2
bjam:
bjam stage --stagedir=<stage-dir>
【问题讨论】:
在我使用 64 位 VS2013 b2.exe and bjam.exe are identical 构建 Boost 时,如果你区分它们。我在您链接到的页面上看不到-s
标签差异。如果s
出现在文件名的 ABI 部分,这意味着您要求 Boost 静态链接到运行时。当您构建 Boost DLL 时,boost_xxxx.lib
是对应的 Boost DLL 的 import libraries,因此您可以在链接时链接到它们。 libboost_xxxx.lib
是静态 Boost 库。
@Praetorian 谢谢。很抱歉,但我了解静态链接库和动态链接库之间的区别。我的问题是 libboost_xxxx.lib 如何成为没有-s
标签的静态库?我有一个名为 boost_xxxx.lib 的文件(没有-s
标签)和它的 DLL 和一个名为 libboost_xxxx.lib 的文件(同样没有-s
标签)没有它的 DLL 和一个名为 libboost_xxxx-s.lib 的文件(带有@987654340 @ 标签)。那么为什么我有 2 个导入库但只有一个有它的 DLL 文件?如果你说的是对的,为什么我有 2 个静态库? An example.
它不是偶然静态链接到运行时的,你一定要求 b2 这样做。大概您还要求它为您构建运行时链接版本(没有s
)。您可以使用runtime-link=static,shared
来做到这一点。如果您使用调用 b2/bjam 的确切命令更新问题,您的问题会更容易回答。
好吧,这只是荒谬的转折,不是吗?您正在使用不同的选项调用 b2 和 bjam (我们已经确定它们是相同的),然后对产生不同的构建工件感到惊讶?我相信默认的--build-type
是minimal
,它只构建Boost 库的发布版本,而您的示例中的--build-type=complete
将构建所有可能的变体。我知道 Boost 构建文档不是最好的,但如果您在 Google 上搜索特定选项,您会发现它们正在 Boost 邮件列表或其他地方进行讨论。
@Praetorian 既然你提到了它,我也看到了我的可笑之处。无论如何,感谢所有回复。我很感激。
【参考方案1】:
b2 和 bjam 是相同的文件,只是它们的名称不同。不同的结果是使用不同参数调用它们的结果。
关于首选名称:调用 ./b2 --help
和 ./bjam --help
都会产生名称 b2
。
【讨论】:
两个非常好的“--help”确实是完全相同的描述。所以现在的问题是他们为什么要保留这两个?也许编译 Boost 还不够复杂? :D 这不是最整洁的项目^^ 另外,我猜他们可能已经为旧版 bjam 可执行文件选择了符号链接或 CSH 脚本,当然,除了 boost 支持“Microsoft Windows”系列平台,这两者都不是一个选项,而不是仅仅使用“Microsoft Windows”平台上的二进制副本和其他解决方案之一,他们从技术角度追求简单性和一致性,我完全理解并在这个非常具体的案例?以上是关于b2 vs bjam 用于构建 Boost 库的主要内容,如果未能解决你的问题,请参考以下文章