如何使用 bcp 提取 boost::filesystem

How to extract boost::filesystem using bcp

我正在尝试创建一个包含文件系统模块的 boost 库的子集,这样我就可以将该子集包含在我的项目存储库中。在我手动复制 .lib 文件之前,我遇到了链接器错误。我在 Windows 7 64 位上使用 Visual Studio 2013。

我已经使用 bcp 成功提取了 boost/algorithm/string.hpp 及其依赖项,步骤如下:

  1. 从 boost.org 下载 (v 1.57.0)。

  2. 已提取。

  3. 运行

    bootstrap.bat
    

    然后

    b2.exe
    

    Getting Started on Windows 所述。

    (我不知道 b2 对我的目的是否必要。)

  4. 通过打开命令提示符构建 bcp 工具,我在其中提取了 boost 存档,并且 运行

    bjam tools\bcp
    

    如所述here

  5. 通过 运行

    创建了 boost 库子集
    dist\bin\bcp.exe algorithm/string.hpp [outdir]
    
  6. 将结果复制到我的项目下的子文件夹中,将boost目录添加到C++包含搜索路径,并构建项目。

...

当我将文件系统或 filesystem.hpp 添加到上面的命令时,(即使我在我自己的源文件上使用 --scan 选项)并将结果复制到我的项目文件夹,然后只是尝试包括 "boost/filesystem.hpp",我得到

LINK : fatal error LNK1104: cannot open file 'libboost_system-vc120-mt-gd-1_57.lib'

在 bcp 的输出中找不到 *.lib 个文件。为了构建它,我必须手动将 libboost_system-*.liblibboost_filesystem-*.lib 文件从 stage\lib\ 复制到我的项目(并将包含它们的目录添加到项目属性 -> 配置属性 ->链接器 -> 常规 -> 附加库目录)。

bcp 没有复制所需的所有内容,这是预期的行为吗?还是我错过了一步?还是 bcp 错误?

简答

bcp 只会复制源文件,因此您必须从 bcp 生成的源树中重新构建库。所以是的,这是预期的行为,是的,你错过了一步。 :)

我不认为是bcp本身的bug,但是生成Boost子集的过程肯定不是特别人性化。见下文。

长答案

如果您获得需要编译的依赖项(例如 boost/system),您还需要包含能够在新源代码树中构建所需的内容。 Boost 版本之间的依赖关系似乎有所不同,但通过反复试验,我发现对于 1.57,你需要添加 buildbootstrap.batbootstrap.shboostcpp.jamboost-build.jam 到 bcp 命令,以便您可以从新的源代码树进行构建:

dist\bin\bcp.exe algorithm/string.hpp build bootstrap.bat bootstrap.sh boostcpp.jam boost-build.jam [outdir]

编辑: 根据 Boost 版本,您可能还需要在上面的行中添加 config 以防止构建错误(由 Sebastian Marsching 建议)。 -- 结束编辑

然后,这确实感觉像是构建脚本中的错误,您必须在新生成的树中打开顶级 Jamfile 并注释掉或删除提到 [= 的两个 use-project 行18=] 和 /boost/libs/wave/tool。否则找不到这些目录将破坏构建。当然,另一种选择是在 bcp 命令行中包含 tools/inspect 和 wave,但是它们带来了很多依赖项,所以我不建议这样做,除非你想要这些特定的 tools/libraries .

然后您需要在您自己的项目中添加一个构建步骤来构建库,使用与构建完整 Boost 包相同的过程(即您的步骤 3,但在您的 "minified" 源代码中树)。

如果需要,您可以将已经构建的 b2 和 bjam 二进制文件添加到您的源代码树而不是 bootstrap 步骤,但是您将只能在这些二进制文件可以 运行.

顺便说一句,你第三步的 "b2" 部分确实没有必要。

我在GitHub上分叉了bcp,并编译出一个二进制文件bcp,然后我使用这个二进制bcp从BOOST库中提取出所有必要的bcp头文件源文件。然后我打包了一个独立的 bcp 发行版。 (您可以轻松地编译代码并在 Windows 或 Linux 上获得一个无依赖性 bcp 文件。我在我的叉子上提供了几个下载 links。)

这个过程可能对你有帮助,看看here for detail. I came across link problems too, see Boost auto_link is the cause of build failure on Windows,把这个头文件注释掉就可以了。

Windows MSVC 上的 link 问题是由于 Boost 的自动link 行为。查看 boost/config/auto_link.hpp 了解更多信息。