为 Visual Studio 构建 Boost 库
为 Visual Studio 构建 Boost 库
引言
对于 C++ 社区来说,Boost 计划是继 STL 之后最热门的技术。虽然文档写得很好,但要快速上手可能会让人不知所措。这篇简单的文章解释了一种构建 Boost 库的方法。我写这篇文章是因为新闻组中有很多关于链接器错误的问题,如果你尝试链接某些 Boost 库就会出现这些错误。原始文章写于 Boost 版本 1.33,但更新版本仅适用于版本 1.34 中引入的新 Bjam 语法。构建脚本适用于版本 1.57。
Boost
虽然大多数 Boost 库都是基于模板的(即仅头文件),但其中一些库——例如 date-time、regex、filesystem、signals——附带 cpp 源代码文件,因此需要生成库。Boost 使用一个名为 Bjam 的构建系统,它可以配置用于许多平台。我只在 Windows 和 Visual Studio 上工作,所以我将在这里描述适用于 Visual Studio 2003、2008、2010 和 2013 的配置。
构建 Boost
下载 Boost 库并将其解压到一个文件夹后——本文档中引用为<boost_root>,例如在我的电脑上是C:\work sdk\boost,就需要构建这些库。
- 构建 Bjam
- 构建 Boost 库
构建 Bjam
Bjam 可以通过两种方式构建
- 使用位于<boost_root>中的 'bootstrap.bat' 批处理文件。运行此批处理文件后,Bjam 将自动构建并添加到根目录。从 boost 1.71 开始,bjam.exe 不再被复制。请改用 b2.exe。
- 手动构建 Bjam:浏览到<boost_root>\tools\build\jam_src,然后在命令提示符中运行build.bat。这将开始构建 Bjam,最终输出到<boost_root>\tools\build\jam_src\bin.ntx86\bjam.exe。将此文件复制到 Boost 的根目录<boost_root>。对于当前版本(boost 1.71),该文件夹已更改为<boost_root>\tools\build\src\engine。
构建 Boost 库
必须告知 Bjam 系统你想要构建调试/发布库、考虑多线程构建、构建静态或动态库以及链接到各种 STL 或平台选项。我只使用 Visual Studio 和 Plauger 的 STL,并选择以下配置:
- 构建一个支持多线程和动态链接的调试版本。
- 构建一个支持多线程和动态链接的发布版本。
随着 Visual Studio 2005 / 2008 的发布,Microsoft 支持 CRT 的并行安装。通过清单文件,可以将模块绑定到特定版本的 CRT。Boost 库也依赖于 CRT,你可以通过 '_BIND_TO_CURRENT_VCLIBS_VERSION
' 定义来指示构建过程使用最新版本。
注意:这里的命令行使用 bjam.exe,但 b2.exe 也可以正常工作。
对于 Visual Studio 2003,这会产生以下选项:
- bjam toolset=msvc-7.1 variant=debug threading=multi link=shared
- bjam toolset=msvc-7.1 variant=release threading=multi link=shared
对于 Visual Studio 2008:
- bjam toolset=msvc-9.0 variant=debug threading=multi link=shared define=_BIND_TO_CURRENT_VCLIBS_VERSION
- bjam toolset=msvc-9.0 variant=release threading=multi link=shared define=_BIND_TO_CURRENT_VCLIBS_VERSION
对于 Visual Studio 2010:
- bjam toolset=msvc-10.0 variant=debug threading=multi link=shared define=_BIND_TO_CURRENT_VCLIBS_VERSION
- bjam toolset=msvc-10.0 variant=release threading=multi link=shared define=_BIND_TO_CURRENT_VCLIBS_VERSION
对于 Visual Studio 2013:
- bjam toolset=msvc-12.0 variant=debug threading=multi link=shared define=_BIND_TO_CURRENT_VCLIBS_VERSION
- bjam toolset=msvc-12.0 variant=release threading=multi link=shared define=_BIND_TO_CURRENT_VCLIBS_VERSION
我已经创建了八个具有相同命令的批处理文件。请注意,这些文件是 zip 文件,因为 codeproject 不允许上传 *.bat 文件。
- zbuilddebug_vc71.bat
- zbuildrelease_vc71.bat
- zbuilddebug_vc90.bat
- zbuildrelease_vc90.bat
- zbuilddebug_vc100.bat
- zbuildrelease_vc100.bat
- zbuilddebug_vc120.bat
- zbuildrelease_vc120.bat
解压缩这些批处理文件并将它们复制到 Boost 的根目录<boost_root>。现在可以构建库了。
- 打开命令提示符。
- 从你喜欢的 Visual Studio 版本运行vcvars32.bat。
- 运行批处理文件,例如zbuilddebug_vc71.bat。
Bjam 现在将尝试构建库。
全部构建
对于忙碌的软件工程师,我提供以下批处理文件,它们可以一次性完成所有操作:如果 bjam 不存在,它们会构建 bjam,然后一次性构建调试和发布模式的库。
构建过程完成后,库可执行文件将创建在<boost_root>\bin.v2目录中,例如:
- boost_date_time-vc120-mt-gd-1_57.dll 用于 date-time 库的多线程调试构建。
- boost_date_time-vc120-mt-1_57.dll 用于 date-time 库的多线程发布构建。
由于所有这些文件都以各自的库名构建,你可以将它们全部复制到一个位置——即搜索 'mt-gd-1_57 和 mt-1_57——并调整 Visual Studio 指向该库位置。或者,你可以使用<boost_root>\stage目录。但是,此目录不包含关联的 PDB 文件,这在调试时很不方便。
使用 Boost 库
我们已经构建了共享库,因此必须指示 Visual Studio 进行链接。幸运的是,Boost 已集成了“自动链接”功能。因此,可以使用预处理器链接到正确的库。定义以下预处理器语句:
BOOST_ALL_DYN_LINK
BOOST_LIB_DIAGNOSTIC
更好的是,在包含 Boost 头文件之前,在你的预编译头文件中包含一个头文件:
有改进空间
- 出于某种原因,构建了“普通”的、即非动态的库。
- Python 库也应该构建,但出于某种原因被排除了。
- Visual Studio 2005 引入了安全的 C 和迭代器概念。Boost 库不喜欢它们,应该禁用。
- 预编译头文件规范。没有它,构建库需要半小时。
历史
- 2005 年 9 月 11 日 - 发布原始版本
- 2007 年 7 月 18 日 - 更新为 Boost 1.34 语法
- 2009 年 11 月 25 日 - 更新了清单文件和“all”批处理文件;移除了旧语法
- 2013 年 8 月 27 日 - 为 VS2010、VS2013 更新
- 2017 年 9 月 5 日 - b2