【问题标题】:How do I use BCP to extract a subset of Boost which can be built?如何使用 BCP 提取可以构建的 Boost 子集?
【发布时间】:2014-11-25 18:06:06
【问题描述】:

我正在尝试在 Boost 中使用 bcp tool 来提取标题/库的子集以在我的项目中使用。

  • 操作系统:Linux Ubuntu 12.04 LTS x64
  • Boost 版本:1.56.0,下载为 来自 boost.org 的源代码

我也想使用 bcp 提供的自定义命名空间,但需要构建生成的代码,这并不像应有的那么简单。

我本来以为很简单的

./dist/bin/bcp --namespace=myboost build filesystem ../myboost

足以生成一组可以构建“文件系统”库的文件,但似乎还有一些额外的问题不断出现。

我在网上阅读了尽可能多的相关帖子,但没有人提出有效的解决方案。

我遵循的步骤和相应的错误消息在下面详细说明。


解压boost 1.56.0 tarball后,我做了以下事情:

./bootstrap.sh
./b2 tools/bcp
mkdir ../myboost
./dist/bin/bcp --namespace=myboost build filesystem ../myboost

复制到 ../myboost 的文件不包含 bootstrap.sh、b2、bjam 或其他 *.jam 文件,这似乎是“构建”目标应该包含的内容,对吧?

其他来源(包括 stackoverflow 帖子)建议从原始 boost 位置复制这些文件:

cp bootstrap.sh boost-build.jam boostcpp.jam ../myboost
cd ../myboost
./bootstrap.sh

然后构建 b2 和 bjam ok。

在运行 b2 时,事情发生了翻天覆地的变化:

./b2

/work/approved-osslibs/boost/boost-1.56.0/myboost/tools/build/src/build /project.jam:262: in find-jamfile from module project
error: Unable to load Jamfile.
error: Could not find a Jamfile in directory 'tools/inspect/build'.
error: Attempted to find it with pattern '[Bb]uild.jam [Jj]amfile.v2 [Jj]amfile [Jj]amfile.jam'.
error: Please consult the documentation at 'http://www.boost.org'.
<error backtrace lines snipped>

所以这对我来说意味着“构建”工具依赖于“检查”,所以我们返回并复制它:

cd ../boost_1_56_0
./dist/bin/bcp --namespace=myboost inspect ../myboost
cd ../myboost
./b2

导致错误:

/work/myboost/tools/build/src/build/project.jam:262: in find-jamfile from module project
error: Unable to load Jamfile.
error: Could not find a Jamfile in directory 'libs/wave/tool/build'.
error: Attempted to find it with pattern '[Bb]uild.jam [Jj]amfile.v2 [Jj]amfile [Jj]amfile.jam'.
error: Please consult the documentation at 'http://www.boost.org'.
<error backtrace lines snipped>

所以这意味着“构建”也取决于波......

cd ../boost_1_56_0
./dist/bin/bcp --namespace=myboost wave ../myboost
cd ../myboost
./b2

此时我遇到了这个错误:

/work/myboost/tools/build/src/build/targets.jam:397: in find-really
*** argument error
* rule project.is-registered-id ( id )
* called with: (  )
* missing argument id
/work/myboost/tools/build/src/build/project.jam:600:see definition of rule 'project.is-registered-id' being called
<error backtrace lines snipped>

我发现了这个与this ticket 中引用的 boost 文件系统库相关的特定错误,但这应该已经修复,所以我没想到会在最新版本的 Boost 1.56.0 中看到它。

发生了什么事?

为什么 bcp 不能只为一个 boost 库创建一个可执行的构建系统?

为什么构建依赖于inspect 和wave,这会在提取的“myboost”中添加很多不必要的标头?

对于这个问题的任何帮助将不胜感激。

【问题讨论】:

  • 这似乎只是 Boost 1.56.0 的问题 使用 Boost 1.55.0 "bcp build filesystem ../myboost" 在 myboost 中生成所有必要的文件并设法构建 OK。
  • 我最近也玩过同样的打地鼠游戏。我发现我必须手动添加库 chronoinspectsystemwave 才能使其工作。我只能猜测bcp 的当前版本不太擅长拾取 Boost 组件之间的传递依赖关系。无论如何,添加另外两个库(就像你对 waveinspect 所做的那样)足以让它对我有用。
  • 我说得太早了。结果我不得不做一个cp -a $BOOST_ROOT/boost/atomic $TARGET_DIR/boost 来编译所有东西。我不知道是否只是我做错了™,但这是我使用bcp 的典型经验:它永远不会完全正确地获得依赖关系,所以你总是需要做一些手动复制才能带来缺少标头,或者使用它错过的明确的库列表再次调用它。仍然是一个非常有用的工具!

标签: c++ linux boost build


【解决方案1】:

我今天在尝试使用 Boost 1.64(我在 MS Windows 下使用 MSVC 2010 编译)时遇到了许多问题。感谢您为我指明正确的方向,顺便说一句。

  • 在原始 Boost 目录中以 bootstrap.batb2 -j 8 tools\bcp 开头。 (在此处以及下方,将 8 替换为要同时运行的作业数。)
  • 在运行.\dist\bin\bcp 时,我发现我必须在命令行中包含tools\build\srclibs\config\checks\architecture,以便以后的构建工作。
  • 我还必须将bootstrap.batboost-build.jamboostcpp.jam 复制到我的copy-boost 目录中。
  • 我不知道为什么,但我不得不重命名我原来的 Boost 目录(即运行 bcp 的那个目录),否则构建最终会回到那里。

之后,更改到我复制的boost 目录并运行bootstrap.bat 允许我构建我的精简版Boost,并更改了顶级命名空间。

b2 -j 8 toolset=msvc-10.0 threading=multi link=shared address-model=32 variant=debug

b2 -j 8 toolset=msvc-10.0 threading=multi link=shared address-model=32 variant=release

move stage\lib lib32-msvc-10.0

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 2010-10-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多