如何使用bcp提取boost :: filesystem

cp.*_*ngr 4 c++ boost 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
    
    Run Code Online (Sandbox Code Playgroud)

    然后

    b2.exe
    
    Run Code Online (Sandbox Code Playgroud)

    Windows上的入门中所述.

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

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

    bjam tools\bcp
    
    Run Code Online (Sandbox Code Playgroud)

    作为描述在这里.

  5. 通过运行创建boost库子集

    dist\bin\bcp.exe algorithm/string.hpp [outdir]
    
    Run Code Online (Sandbox Code Playgroud)
  6. 将结果复制到我的项目下的子文件夹中,将boost目录添加到C++ include搜索路径,并构建项目.

...

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

LINK : fatal error LNK1104: cannot open file 'libboost_system-vc120-mt-gd-1_57.lib'
Run Code Online (Sandbox Code Playgroud)

*.libbcp的输出中找不到文件.为了得到它来建立,我不得不手动复制libboost_system-*.liblibboost_filesystem-*.libLIB \文件从舞台\我的项目(并添加包含他们项目属性目录- >配置属性- >链接器- >常规- >附加库目录).

这是bcp没有复制所需内容的预期行为吗?还是我错过了一步?或者它是一个bcp bug?

Emi*_*rke 16

简短的回答

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

我不认为这是bcp本身的错误,但生成Boost子集的过程肯定不是特别用户友好的.见下文.

答案很长

如果你得到需要编译的依赖项(例如boost/system),你还需要包含能够在新的源代码树中构建所需的东西.的依赖似乎加速版本之间改变,但通过试验和错误我发现,对于1.57你需要添加build,bootstrap.bat,bootstrap.sh,boostcpp.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提及行/boost/tools/inspect/boost/libs/wave/tool.否则,找不到这些目录的失败将破坏构建.当然,另一个选择是在bcp命令行中包含工具/检查和波形,但是它们带来了很多依赖性,所以除非你需要这些特定的工具/库,否则我不建议这样做.

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

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

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

  • 谢谢,非常好的信息.仅供参考,至少在Boost 1.64(以及在Linux上),他们似乎已经修复了检查/波浪问题; 它们受到"if [path.exists ...]"块的保护.我没有必要在运行bcp和调用minified bootstrap.sh之间编辑任何文件. (2认同)