Boost C++ 库

...世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码标准

在 Windows 上入门

CygwinMinGW 用户

如果您打算从 Windows 命令提示符使用您的工具,那么您来对地方了。如果您打算从 Cygwin bash shell 构建,那么您实际上是在 POSIX 平台上运行,应该按照 在 Unix 变体上入门 的说明操作。其他命令 shell(例如 MinGW 的 MSYS)不受支持——它们可能有效也可能无效。

索引

1   获取 Boost

获取 Boost 副本最可靠的方法是下载 boost_1_82_0.7zboost_1_82_0.zip 并将其解压缩到安装完整的 Boost 发行版。 1

2   Boost 发行版

这是生成的目录结构的草图

boost_1_82_0\ .................The “boost root directory”
   index.htm .........A copy of www.boost.org starts here
   boost\ .........................All Boost Header files
   lib\ .....................precompiled library binaries
   libs\ ............Tests, .cpps, docs, etc., by library
     index.html ........Library documentation starts here
     algorithm\
     any\
     array\
                     …more libraries…
   status\ .........................Boost-wide test suite
   tools\ ...........Utilities, e.g. Boost.Build, quickbook, bcp
   more\ ..........................Policy documents, etc.
   doc\ ...............A subset of all Boost library docs

重要的是要注意以下几点

  1. Boost 根目录的路径(通常为C:\Program Files\boost\boost_1_82_0)有时在文档和邮件列表中称为$BOOST_ROOT

  2. 要编译 Boost 中的任何内容,您需要一个包含boost\子目录的目录,该目录位于您的#include路径中。Microsoft Visual Studio 中设置#include路径的具体步骤将在本文档后面的部分介绍;如果您使用其他 IDE,请参阅您的产品文档以获取说明。

  3. 由于 Boost 的所有头文件都具有.hpp扩展名,并且位于boost\子目录中,因此您的 Boost#include指令将类似于

    #include <boost/whatever.hpp>
    

    #include "boost/whatever.hpp"
    

    ,具体取决于您对使用尖括号包含的偏好。即使 Windows 用户也可以(并且出于可移植性原因,可能应该)在#include指令中使用正斜杠;您的编译器并不关心这一点。

  4. 不要被doc\子目录分散注意力;它只包含 Boost 文档的一个子集。如果您正在寻找完整的文档,请从libs\index.html开始。

3   仅限头文件库

许多人首先想知道的是:“如何构建 Boost?”好消息是,通常不需要构建任何东西。

无需构建?

大多数 Boost 库是仅限头文件的:它们完全由包含模板和内联函数的头文件组成,并且在链接时不需要单独编译的库二进制文件或特殊处理。

唯一必须单独构建的 Boost 库是

一些库具有可选的单独编译的二进制文件

4   使用 Boost 构建简单程序

为了简化操作,让我们从使用仅限头文件的库开始。以下程序从标准输入读取一系列整数,使用 Boost.Lambda 将每个数字乘以 3,并将它们写入标准输出

#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " " );
}

将此程序的文本复制到名为example.cpp.

注意

要构建本指南中的示例,您可以使用 Visual Studio 等集成开发环境 (IDE),也可以从 命令提示符 中发出命令。由于每个 IDE 和编译器都有不同的选项,而微软的编译器是 Windows 上占主导地位的编译器,因此我们在此处只提供有关 Visual Studio 2005 和 .NET 2003 IDE 及其各自的命令提示符编译器的具体说明(使用命令提示符稍微简单一些)。如果您使用的是其他编译器或 IDE,则应该可以比较容易地将这些说明调整到您的环境。

4.1   从 Visual Studio IDE 构建

  • 从 Visual Studio 的文件菜单中,选择新建 > 项目…

  • 在生成的新建项目对话框的左侧窗格中,选择Visual C++ > Win32

  • 在右侧窗格中,选择Win32 控制台应用程序(VS8.0)或Win32 控制台项目(VS7.1)。

  • 名称字段中,输入“example”

  • 解决方案资源管理器窗格中右键单击example,然后从弹出的菜单中选择属性

  • 配置属性 > C/C++ > 常规 > 附加包含目录中,输入 Boost 根目录的路径,例如

    C:\Program Files\boost\boost_1_82_0

  • 配置属性 > C/C++ > 预编译头中,将使用预编译头 (/Yu) 更改为不使用预编译头2

  • 将 IDE 生成的example.cpp的内容替换为上面的示例代码。

  • 生成菜单中,选择生成解决方案

要测试您的应用程序,请按 F5 键,并在生成的窗口中键入以下内容,然后按 Return 键

1 2 3

然后按住 Ctrl 键并按“Z”,然后按 Return 键。

跳到下一步

4.2   或者,从命令提示符构建

从您计算机的开始菜单中,如果您是 Visual Studio 2005 用户,请选择

所有程序 > Microsoft Visual Studio 2005 > Visual Studio 工具 > Visual Studio 2005 命令提示符

或者,如果您是 Visual Studio .NET 2003 用户,请选择

所有程序 > Microsoft Visual Studio .NET 2003 > Visual Studio .NET 工具 > Visual Studio .NET 2003 命令提示符

以调出一个针对 Visual Studio 编译器设置的特殊 命令提示符 窗口。在该窗口中,将 当前目录 设置到适合创建一些临时文件的位置,然后键入以下命令,并按 Return 键

cl /EHsc /I path\to\boost_1_82_0 path\to\example.cpp

要测试结果,请键入

echo 1 2 3 | example

4.3   错误和警告

如果您看到来自 Boost 头文件的编译器警告,请不要惊慌。我们会尝试消除它们,但这样做并不总是可行的。 4 错误是另一回事。如果您在教程的这一步中看到编译错误,请检查您是否已正确复制 示例程序 以及您是否已正确识别 Boost 根目录

5   准备使用 Boost 库二进制文件

如果您想使用任何单独编译的 Boost 库,则需要获取库二进制文件。

5.1   简化的从源代码构建

如果您希望使用 Visual C++ 从源代码构建,则可以使用本节中描述的简单构建过程。打开命令提示符,并将您的当前目录更改为 Boost 根目录。然后,键入以下命令

bootstrap
.\b2

第一个命令为使用 Boost.Build 系统做准备。第二个命令调用 Boost.Build 来构建单独编译的 Boost 库。有关允许选项的列表,请参阅 Boost.Build 文档

5.2   或者,从源代码构建二进制文件

如果您使用的是早期版本的 Visual C++ 或来自其他供应商的编译器,则需要使用 Boost.Build 来创建自己的二进制文件。

5.2.1   安装 Boost.Build

Boost.Build 是一个基于文本的系统,用于开发、测试和安装软件。首先,您需要构建并安装它。为此

  1. 转到目录tools\build\.
  2. 运行bootstrap.bat
  3. 运行b2 install --prefix=PREFIX,其中 PREFIX 是您希望安装 Boost.Build 的目录
  4. PREFIX\bin添加到您的 PATH 环境变量中。

5.2.2   识别您的工具集

首先,在以下表格中找到与您的编译器相对应的工具集(最新列表始终可在 Boost.Build 文档中找到)。

注意

如果您之前为 构建 b2 选择了工具集,则应假设它无法正常工作,而是从下表中重新选择。

工具集名称 供应商 说明
acc 惠普 仅知最新版本才能与 Boost 良好配合
borland Borland  
como Comeau Computing 使用此工具集可能需要 配置 另一个工具集充当其后端。
darwin 苹果电脑 Apple 的 GCC 工具链版本,支持 Darwin 和 MacOS X 功能,例如框架。
gcc GNU 项目 包括对 Cygwin 和 MinGW 编译器的支持。
hp_cxx 惠普 针对 Tru64 操作系统。
intel 英特尔  
msvc 微软  
sun Oracle 仅知最新版本才能与 Boost 良好配合。请注意,Oracle/Sun 编译器有许多会影响二进制兼容性的选项:库的构建必须使用与应用程序将使用的选项相同的选项。特别要注意默认的标准库可能与 Boost 不兼容,除非您是为 C++11 构建的。您需要的特定编译器选项可以通过 b2 命令行选项注入cxxflags=``and ``linkflags=. 例如,要使用 Apache 标准库在 C++03 模式下构建,请使用b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4.
vacpp IBM VisualAge C++ 编译器。

如果您安装了多个版本的特定编译器,则可以在工具集名称后附加版本号,并在其前面加上连字符,例如intel-9.0borland-5.4.3. 在 Windows 上,即使您只安装了一个版本,也要附加版本号(除非您使用的是 msvc 或 gcc 工具集,它们有特殊的版本检测代码),否则 自动链接 将失败。

5.2.3   选择构建目录

Boost.Build 将在构建过程中生成的所有中间文件都放置到 **构建目录** 中。如果您的 Boost 根目录是可写的,此步骤不是严格必要的:默认情况下,Boost.Build 将在您的当前工作目录中创建一个bin.v2/子目录用于此目的。

5.2.4   调用b2

将您的当前目录更改为 Boost 根目录并调用b2如下所示

b2 --build-dir=build-directory toolset=toolset-name --build-type=complete stage

有关这些和其他调用选项的完整描述,请参阅 Boost.Build 文档

例如,您的会话可能如下所示:3

C:\WINDOWS> cd C:\Program Files\boost\boost_1_82_0
C:\Program Files\boost\boost_1_82_0> b2 ^
More? --build-dir="C:\Documents and Settings\dave\build-boost" ^
More? --build-type=complete msvc stage

请务必阅读 此说明,了解^, 更多?和引号(")在该行中的外观。

选项“--build-type=complete”会导致 Boost.Build 构建所有支持的库变体。有关如何仅构建特定变体的说明,请在 Boost 用户邮件列表 上提问。

构建特殊的stage目标将 Boost 库二进制文件放置在stage\lib\Boost 树的子目录中。要使用其他目录,请传递--stagedir=目录 选项到b2.

注意

b2区分大小写;重要的是,上面 **粗体** 显示的所有部分都必须完全是小写。

有关您可以传递给调用时的其他选项的说明,b2,类型

b2 --help

特别是,为了限制构建花费的时间,您可能希望

  • 查看使用库名称的列表--show-libraries
  • 限制使用库名称构建哪些库--with-library-name--without-library-name 选项
  • 通过添加选择特定构建变体releasedebug到命令行。

注意

Boost.Build 可以产生大量的输出,这会导致难以发现问题。如果您想确保一切顺利,您可以通过在命令行末尾追加“>build.log 2>&1” 将输出重定向到文件。

5.3   预期的构建输出

在构建 Boost 库的过程中,您可能会看到控制台上打印一些消息。这些消息可能包括

  • 有关 Boost 库配置的通知——例如,Regex 库在没有 Unicode 支持的情况下构建时会输出有关 ICU 的消息,并且如果没有安装 Python,Python 库可能会跳过(但会发出通知),而不会出现错误。

  • 构建工具发出的消息,报告已构建或跳过的目标数量。如果这些数字对您没有意义,不要感到惊讶;每个库都有很多目标。

  • 描述工具正在执行的操作的构建操作消息,看起来像

    toolset-name.c++ long/path/to/file/being/built
    
  • 编译器警告。

5.4   如果出现构建错误

构建 Boost 库时,您看到的唯一错误消息(如果有)应该与 IOStreams 库对 zip 和 bzip2 格式的支持有关,如 此处所述。如果您需要这些功能,请安装 libz 和 libbz2 的相关开发包。构建 Boost 库时的其他错误令人担忧。

如果看起来构建系统无法找到您的编译器和/或链接器,请考虑设置user-config.jam文件,如 此处所述。如果这不是您的问题,或者该user-config.jam文件对您不起作用,请将有关为您的编译器配置 Boost 的问题提交到 Boost 用户邮件列表

7   结论和进一步资源

这结束了您对 Boost 以及将其集成到程序中的介绍。当您开始认真使用 Boost 时,您一定会希望我们涵盖一些其他要点。将来有一天,我们可能会有一本“入门系列第二卷”来解决这些问题。在此之前,我们建议您参考以下资源。如果您找不到所需内容,或者有任何需要我们改进本文档的地方,请将其发布到 Boost 用户邮件列表

前进

祝您好运,玩得开心!

— Boost 开发人员


[1]我们建议您下载 boost_1_82_0.7z 并使用 7-Zip 解压缩它。我们不再推荐使用 .zip 文件来存储 Boost,因为它们的体积是等效 .7z 文件的两倍。我们不建议使用 Windows 内置的解压缩功能,因为它解压缩大型压缩文件时速度非常慢。
[2]使用预编译头文件与 Boost 没有任何问题;这些说明只是避免使用预编译头文件,因为这将需要对示例中使用的源代码进行 Visual Studio 特定的更改。
[3]

在这个例子中,插入符号字符^是一种在多行上继续命令的方式,并且必须是继续行中使用的 **最后一个字符**(即不要在其后添加空格)。命令提示符会用更多?来提示输入更多内容。您可以随意省略插入符号和后续换行符;我们使用它们是为了使示例适合合理的宽度页面。

命令提示符将命令中的每个空格都视为参数分隔符。这意味着当单个命令行参数包含空格时,需要使用引号(")将文本组合在一起,例如

--build-dir="C:\Documents_and_Settings\dave\build-boost"

同样,例如,您不能在=符号周围添加空格,例如

--build-dir_=_"C:\Documents and Settings\dave\build-boost"
[4]请记住,警告是特定于每个编译器实现的。给定 Boost 库的开发人员可能无法访问您的编译器。此外,某些警告在通用代码中非常难以消除,以至于不值得为此费心。最后,某些编译器没有任何用于抑制警告的源代码机制。
[5]这种约定将 Boost 库的静态版本与相同配置的 Boost DLL 的导入库区分开来,否则它们将具有相同的名称。
[6]这些库是在没有优化或内联的情况下编译的,启用了完整的调试符号,并且没有NDEBUG #defined。虽然有时这些选择不会影响与其他已编译代码的二进制兼容性,但您不能依赖 Boost 库的这种兼容性。