我正在尝试创建包括文件系统模块在内的 boost 库的子集,以便我可以将该子集包含在我的项目存储库中。在我手动复制 .lib 文件之前,我遇到了链接器错误。我在 Windows 7 64 位上使用 Visual Studio 2013。
通过使用以下步骤,我已经使用 bcp 成功提取了 boost/algorithm/string.hpp 及其依赖项:
-
从 boost.org 下载 (v 1.57.0)。
-
提取。
-
跑
bootstrap.bat
然后b2.exe
如 Windows 入门中所述。
(我不知道 b2 对于我的目的是否必要。 -
通过打开命令提示符构建 bcp 工具,我在其中提取了提升存档,然后运行
bjam toolsbcp
如此处所述。
-
通过运行创建提升库子集
distbinbcp.exe algorithm/string.hpp [outdir]
-
将结果复制到我的项目下的子文件夹中,将 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-*.lib
和libboost_filesystem-*.lib
文件从 stage\lib\ 复制到我的项目中(并将包含它们的目录添加到项目属性 -> 配置属性 -> 链接器 -> 常规 -> 其他库目录)。
这是 bcp 没有复制所有需要的预期行为吗?还是我错过了一步?还是 bcp 错误?
简答
BCP 将仅复制源文件,因此您必须从 BCP 生成的源树重新生成库。 所以是的,这是预期的行为,是的,你错过了一步。:)
我不认为这是 bcp 本身的错误,但生成 Boost 子集的过程肯定不是特别用户友好。 见下文。
长答案
如果你得到需要编译的依赖项(例如 boost/system),你还需要包含能够在新的源代码树中构建所需的内容。 Boost 版本之间的依赖关系似乎发生了变化,但通过反复试验,我发现对于 1.57,您需要将 build
、bootstrap.bat
、bootstrap.sh
、boostcpp.jam
和 boost-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
查看以获取更多信息。