【发布时间】: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。
-
我最近也玩过同样的打地鼠游戏。我发现我必须手动添加库
chrono、inspect、system和wave才能使其工作。我只能猜测bcp的当前版本不太擅长拾取 Boost 组件之间的传递依赖关系。无论如何,添加另外两个库(就像你对wave和inspect所做的那样)足以让它对我有用。 -
我说得太早了。结果我也不得不做一个
cp -a $BOOST_ROOT/boost/atomic $TARGET_DIR/boost来编译所有东西。我不知道是否只是我做错了™,但这是我使用bcp的典型经验:它永远不会完全正确地获得依赖关系,所以你总是需要做一些手动复制才能带来缺少标头,或者使用它错过的明确的库列表再次调用它。仍然是一个非常有用的工具!