如何使用 bcp 提取 boost::文件系统



我正在尝试创建包括文件系统模块在内的 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
    

    如 Windows 入门中所述。

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

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

    bjam toolsbcp
    

    如此处所述。

  5. 通过运行创建提升库子集

    distbinbcp.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 本身的错误,但生成 Boost 子集的过程肯定不是特别用户友好。 见下文。

长答案

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

distbinbcp.exe algorithm/string.hpp build bootstrap.bat bootstrap.sh boostcpp.jam boost-build.jam [outdir]

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

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

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

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

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

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

此过程可能会对您有所帮助,有关详细信息,请查看此处。我也遇到了链接问题,看到 Boost auto_link 是 Windows 上构建失败的原因,只需注释掉这个头文件就可以了。

Windows MSVC上的链接问题是由于Boost的自动链接行为造成的。boost/config/auto_link.hpp查看以获取更多信息。

最新更新