Boost C++ 库

...世界上最受尊敬和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

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\boost 子目录的目录在您的#includeinclude 路径中。 在本文档的后面部分将介绍在 Microsoft Visual Studio 中设置#include路径的具体步骤;如果您使用其他 IDE,请查阅您产品的文档以获取说明。

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

    #include <boost/whatever.hpp>
    

    #include <boost/whatever.hpp>

    #include "boost/whatever.hpp"
    

    #include#include "boost/whatever.hpp"

  4. 取决于您对使用尖括号包含的偏好。即使 Windows 用户也可以(并且,出于可移植性原因,可能应该)在#include 指令中使用正斜杠;您的编译器并不在意。\不要被doc\子目录分散注意力;它只包含 Boost 文档的子集。如果您正在寻找完整的内容,请从libs

3   仅头文件库

index.html

开始。

许多人首先想知道的是,“我如何构建 Boost?” 好消息是,通常情况下,没有什么需要构建的。

无需构建?

Boost.Timer

4   使用 Boost 构建一个简单的程序

Boost.Exception 为 32 位 _MSC_VER==1310 和 _MSC_VER==1400 提供了 exception_ptr 的非侵入式实现,这需要单独编译的二进制文件。 这通过 #define BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR 启用。

#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) << " " );
}

Boost.System 自 Boost 1.69 以来是仅头文件的。为了兼容性,仍然构建了一个存根库,但不再需要链接到它。为了保持简单,让我们从使用仅头文件库开始。以下程序从标准输入读取一系列整数,使用 Boost.Lambda 将每个数字乘以三,然后将它们写入标准输出.

将此程序的文本复制到一个名为

example.cpp

4.1   从 Visual Studio IDE 构建

  • cd directory-name

  • 后跟 Return。例如,

  • cd C:\boost_1_82_0

  • 可以通过在除最后一行之外的所有行的末尾键入插入符号 (^)

  • ) 来跨多行继续长命令。此页面上的一些示例使用该技术来节省水平空间。

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

    C:\Program Files\boost\boost_1_82_0

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

  • 在右侧窗格中,选择 Win32 控制台应用程序 (VS8.0) 或 Win32 控制台项目 (VS7.1)。为了保持简单,让我们从使用仅头文件库开始。以下程序从标准输入读取一系列整数,使用 Boost.Lambda 将每个数字乘以三,然后将它们写入标准输出名称字段中,输入 “example”

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

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

1 2 3

C:\boost_1_82_0

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

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

将 IDE 生成的

example.cpp

的内容替换为上面的示例代码。

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

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

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

1 2 3

echo 1 2 3 | example

4.3   错误和警告

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

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

跳到下一步

5.1   从源代码简化构建

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

bootstrap
.\b2

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

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

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

5.2.1   安装 Boost.Build

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

  1. 以调出为 Visual Studio 编译器设置的特殊 命令提示符窗口。在该窗口中,将 当前目录 设置为适合创建一些临时文件的位置,然后键入以下命令,后跟 Return 键cl /EHsc example.cpp\要测试结果,请键入\.
  2. example < example.cpp如果您看到源自 Boost 头文件的编译器警告,请不要惊慌。我们尝试消除它们,但这样做并非总是可行。4 错误是另一回事。如果您在本教程的这一点看到编译错误,请检查以确保您已正确复制了 示例程序,并且您已正确识别了 Boost 根目录
  3. example < example.cpp如果您想使用任何单独编译的 Boost 库,您需要获取库二进制文件。如果您希望使用 Visual C++ 从源代码构建,您可以使用本节中描述的简单构建过程。打开命令提示符并将当前目录更改为 Boost 根目录。然后,键入以下命令
  4. bootstrap\b2第一个命令准备 Boost.Build 系统以供使用。第二个命令调用 Boost.Build 来构建单独编译的 Boost 库。请查阅 Boost.Build 文档以获取允许选项的列表。

5.2.2   识别您的工具集

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

将此程序的文本复制到一个名为

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

转到目录 tools build
运行 bootstrap.bat b2 install --prefix=
PREFIX,其中 PREFIX 是您希望 Boost.Build 安装到的目录 PREFIX  
bin 添加到您的 PATH 环境变量。 首先,在下表中找到与您的编译器对应的工具集(最新的列表始终可在 Boost.Build 文档中找到)。
如果您之前出于 构建 b2 的目的选择了工具集,您应该假设它不起作用,而是从下表中重新选择。 工具集名称 供应商
注释 acc Hewlett Packard
只有非常新的版本已知与 Boost 配合良好 bootstrap.bat borland
Borland como  
Comeau Computing 使用此工具集可能需要 配置另一个工具集以充当其后端。  
darwin Apple Computer Apple 的 GCC 工具链版本,支持 Darwin 和 MacOS X 功能,例如框架。gccThe Gnu Project包括对 Cygwin 和 MinGW 编译器的支持。.
hp_cxx 目标是 Tru64 操作系统。 intel

Intelmsvc#include <boost/whatever.hpp>Microsoftsun

5.2.3   选择一个构建目录

Oracle只有非常新的版本已知与 Boost 配合良好。请注意,Oracle/Sun 编译器有大量影响二进制兼容性的选项:至关重要的是,库的构建选项必须与您的应用程序将使用的选项相同。尤其要注意的是,默认的标准库可能无法与 Boost 配合良好,除非您正在为 C++11 构建。您需要的特定编译器选项可以使用 b2 命令行选项注入cxxflags=``和 linkflags=

5.2.4   调用b2

。 例如,要在 C++03 模式下使用 Apache 标准库构建,请使用b2b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4

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

vacpp

IBM

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

VisualAge C++ 编译器。^, 如果您安装了特定编译器的多个版本,您可以将版本号附加到工具集名称,并在版本号前加上连字符,例如intel-9.0"borland-5.4.3

在 Windows 上,即使您只安装了一个版本,也请附加版本号(除非您正在使用 msvc 或 gcc 工具集,它们具有特殊的版本检测代码),否则 自动链接 将会失败。

Boost.Build 将在构建时生成的所有中间文件放入 构建目录 中。如果您的 Boost 根目录是可写的,则此步骤不是绝对必要的:默认情况下,Boost.Build 将在您当前的工作目录中创建一个bin.v2/子目录用于此目的。bin.v2/\将您的当前目录更改为 Boost 根目录并调用\b2如下所示b2 --build-type=complete stage installb2.

将此程序的文本复制到一个名为

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

例如,您的会话可能如下所示:3b2C:\boost_1_82_0> b2 --build-type=complete stage install

b2 --help

...building libraries...

  • C:\boost_1_82_0>请务必阅读关于
  • More?和引号 (")) 在该行中外观的 此注释--build-type=complete” 选项使 Boost.Build 构建库的所有受支持的变体。有关如何仅构建特定变体的说明,请在 Boost 用户邮件列表上提问。构建特殊的
  • stage目标将 Boost 库二进制文件放在 Boost 树的#include <boost/whatever.hpp>lib子目录中。要使用不同的目录,请将

将此程序的文本复制到一个名为

--stagedir=directory 选项传递给b2

5.3   预期构建输出

请注意 b2 不区分大小写;重要的是,上面以 粗体 类型显示的所有部分都必须完全小写。

  • 有关您在调用

  • b2 时可以传递的其他选项的说明,请键入

  • b2 --help

    toolset-name.c++ long/path/to/file/being/built
    
  • 特别是,为了限制构建所花费的时间,您可能对以下内容感兴趣

5.4   如果出现构建错误

使用

--show-libraries查看库名称列表使用查看库名称列表--with-

7   结论和更多资源

Sparc

architecture=mips*

p

RS/6000 & PowerPC


[1]architecture=power
[2]字母后的两位数字编码地址模型,如下所示
[3]

地址模型^32 位如果您安装了特定编译器的多个版本,您可以将版本号附加到工具集名称,并在版本号前加上连字符,例如address-model=32

64 位"address-model=64

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

版本标签:完整的 Boost 发布版本号,句点替换为下划线。例如,版本 1.31.1 将标记为 “-1_31_1”。=.lib

--build-dir_=_"C:\Documents and Settings\dave\build-boost"
[4]扩展名:根据操作系统的常用约定确定。在大多数类 Unix 平台上,扩展名为
[5].a
[6].so 分别用于静态库(存档)和共享库。在 Windows 上,.dll