Boost C++ 库

...世界上最受尊敬和专家设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

BCP

John Maddock

根据 Boost 软件许可证,版本 1.0 分发。(请参阅随附文件 LICENSE_1_0.txt 或复制于 https://boost.ac.cn/LICENSE_1_0.txt


目录

概述
示例
语法
行为选择
选项
模块列表
输出路径
依赖关系

bcp 工具是一个用于提取 Boost 子集的工具,它对于希望将库与 Boost 分开分发的 Boost 作者以及希望将 Boost 子集与其应用程序一起分发的 Boost 用户非常有用。

bcp 还可以报告您的代码依赖于 Boost 的哪些部分,以及这些依赖项使用了哪些许可证。

bcp scoped_ptr /foo

将 boost/scoped_ptr.hpp 及其依赖项复制到 /foo。

bcp boost/regex.hpp /foo

将 boost/regex.hpp 和所有依赖项(包括 regex 源代码(在 libs/regex/src 中)和构建文件(在 libs/regex/build 中))复制到 /foo。不复制 regex 文档、测试或示例代码。也不复制 Boost.Build 系统。

bcp regex /foo

将完整的 regex 库(在 libs/regex 中),包括依赖项(例如 regex 测试程序所需的 boost.test 源代码)复制到 /foo。不复制 Boost.Build 系统。

bcp --namespace=myboost --namespace-alias regex config build /foo

将完整的 regex 库(在 libs/regex 中)加上 config 库 (libs/config) 和构建系统 (tools/build) 复制到 /foo,包括所有依赖项。并将 boost 命名空间重命名为myboost,并将二进制库的文件名更改为以“myboost”而不是“boost”作为前缀。 --namespace-alias 选项使 命名空间 boost 成为新名称的别名。

bcp --scan --boost=/boost foo.cpp bar.cpp boost

扫描[非 boost]文件 foo.cpp 和 bar.cpp 中的 boost 依赖项,并将这些依赖项复制到子目录 boost。

bcp --report regex.hpp boost-regex-report.html

为 boost 模块 regex.hpp 创建一个名为 boost-regex-report.html 的 HTML 报告。该报告包含许可证信息、作者详细信息和文件依赖项。

bcp --list [options] module-list

输出模块列表中所有文件的列表,包括依赖项。

bcp [options] module-list output-path

将模块列表中找到的所有文件复制到输出路径

bcp --report [options] module-list html-file

输出包含以下内容的 html 报告文件

  • 所有生效的许可证,以及使用每个许可证的文件,以及使用每个许可证的版权所有者。
  • 任何没有可识别许可证的文件(请向 boost 邮件列表报告这些文件)。
  • 任何没有可识别版权所有者的文件(请向 boost 邮件列表报告这些文件)。
  • 所有版权所有者及其拥有版权的文件。
  • 文件依赖关系信息 - 指示在找到的依赖关系中包含任何特定文件的原因。
--boost=path

将 boost 树的位置设置为路径。如果未提供此选项,则假定当前路径为 Boost 树的根目录。

--namespace=newname 

复制文件时,boost 命名空间的所有出现都将重命名为“newname”。同时将 Boost 二进制文件重命名为使用“newname”而不是“boost”作为前缀。

通常与 --namespace-alias 选项一起使用,这允许在同一个程序中使用两个不同的 Boost 版本,但不能在同一个翻译单元中使用。

--namespace-alias

与 --namespace 选项一起使用时,命名空间 boost 将被声明为新命名空间名称的别名。这允许依赖于 Boost 代码位于 命名空间 boost 中的现有代码无需更改即可编译,同时保留可以通过命名空间更改实现的“强版本控制”。

--scan

将模块列表视为要扫描 boost 依赖项的(可能是非 boost)文件列表,模块列表中列出的文件不会被复制(或列出),只有它们依赖的 boost 文件才会被复制/列出。

--svn

仅复制 svn 版本控制下的文件。

--unix-lines

确保所有复制的文件都使用 Unix 风格的行尾。

当不使用 --scan 选项时,将复制 boost 文件或库名称的列表,可以是

  1. 工具的名称:例如“build”将找到“tools/build”。
  2. 库的名称:例如“regex”。
  3. 标题的名称:例如“scoped_ptr”将找到“boost/scoped_ptr.hpp”。
  4. 标头的名称:例如“scoped_ptr.hpp”将找到“boost/scoped_ptr.hpp”。
  5. 文件的名称:例如“boost/regex.hpp”。

当使用 --scan 选项时,则为要扫描 boost 依赖项的(可能是非 boost)文件列表,因此不会复制/列出模块列表中的文件。

将文件复制到的路径(此路径必须存在)。

文件依赖关系如下所示

  • 扫描 C++ 源文件中的 #includes,然后扫描 boost 源代码树中存在的所有 #includes 的依赖关系,依此类推。
  • C++ 源文件与库的名称相关联,如果该库具有源代码(可能还有构建数据),则将该源代码包含在依赖项中。
  • 检查 C++ 源文件对 Boost.test 的依赖关系(例如,查看它们是否使用 cpp_main 作为入口点)。
  • 扫描 HTML 文件以查找直接依赖关系(图像和样式表,但不包括链接)。

应该注意的是,在实践中,bcp 可能会生成一个相当“臃肿”的依赖关系列表,原因包括

  • 它首先搜索库名称,因此使用“regex”作为名称将提供 libs/regex 目录中的所有内容及其依赖的所有内容。这可能是一个很长的列表,因为所有 regex 测试和示例程序都将被扫描其依赖项。如果您想要一个更小的列表,请尝试使用您实际包含的头文件的名称,或者使用 --scan 选项扫描您的源代码。
  • 如果您包含具有单独源代码的库的头文件,那么您将获得该库的源代码及其所有依赖项。这是故意的,通常需要这些额外的依赖项。
  • 当您包含一个头文件时,bcp 不知道您使用的是什么编译器,因此它会遵循所有可能的预处理器路径。如果您要将 Boost 的一个子集与您的应用程序一起分发,那么通常您希望发生这种情况。

与大多数人的预期相比,上面的最后一点可能会导致找到的标头数量大幅增加。例如,bcp 为 boost/shared_ptr.hpp 找到了 274 个标头依赖项:通过在报告模式下运行 bcp,我们可以看到为什么所有这些标头都被视为依赖项

  • 所有 Config 库头文件都被包含在内(52 个头文件,对于一个编译器来说大约是 6 个)。
  • 许多 MPL 和类型特征代码包含针对您可能需要也可能不需要的损坏编译器的解决方法。通过代码追溯表明,除非用户定义了 BOOST_SP_USE_QUICK_ALLOCATOR,否则大多数这些代码都不需要,但是 bcp 不知道是否会采用该预处理器路径,因此为了以防万一,这些头文件会被包含在内。这增加了大约 48 个头文件(类型特征),以及来自 MPL 的另外 49 个头文件。
  • 预处理器库被 MPL 大量使用:这又增加了 96 个头文件。
  • 共享指针库包含许多特定于平台的代码,分为大约 22 个头文件:通常您的编译器只需要其中几个文件。

如您所见,找到的依赖项数量远大于任何单个编译器使用的依赖项数量,但是,如果您想分发一个可在任何配置、任何编译器、任何平台上使用的 Boost 子集,那么这正是您需要的。如果您想弄清楚您的特定编译器正在使用哪些 Boost 头文件,那么最好的方法是预处理代码并扫描输出中的 boost 头文件包含。您应该意识到结果将非常特定于平台和编译器,并且如果您更改编译器开关(例如启用线程支持),则可能不包含所有需要的头文件。

最后修订时间:2013 年 4 月 18 日 12:30:13 GMT