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”选项使 namespace 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

输出模块列表(module-list)中所有文件(包括依赖项)的列表。

bcp [options] module-list output-path

将模块列表(module-list)中找到的所有文件复制到输出路径(output-path)

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

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

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

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

--namespace=newname 

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

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

--namespace-alias

当与 --namespace 选项结合使用时,namespace boost 将被声明为新命名空间名称的别名。这允许依赖于 namespace 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