Boost C++ 库

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

在 Unix 变体上的入门指南

索引

1   获取 Boost

获取 Boost 的最可靠方法是从 SourceForge 下载发行版

  1. 下载 boost_1_82_0.tar.bz2

  2. 在您想要放置 Boost 安装的目录中,执行

    tar --bzip2 -xf /path/to/boost_1_82_0.tar.bz2
    

其他软件包

RedHat、Debian 和其他发行版的打包者提供 Boost 库包,但是如果您使用第三方包,则可能需要调整这些说明,因为它们的创建者通常选择将 Boost 分解成多个包,重新组织 Boost 发行版的目录结构,和/或重命名库二进制文件。1 如果您遇到任何问题,我们建议您使用来自 SourceForge 的官方 Boost 发行版。

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
   `` ``
   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 根目录的路径(通常为/usr/local/boost_1_82_0)有时被称为$BOOST_ROOT在文档和邮件列表中。

  2. 要编译 Boost 中的任何内容,您需要一个包含boost/子目录的目录在您的#include路径中。 `` ``

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

    #include <boost/whatever.hpp>
    

    #include "boost/whatever.hpp"
    

    取决于您对使用尖括号包含的偏好。 `` ``

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

3   仅限头文件的库

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

无需构建?

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

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

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

4   使用 Boost 构建简单的程序

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

#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.

现在,在您保存example.cpp的目录中,发出以下命令

c++ -I path/to/boost_1_82_0 example.cpp -o example

要测试结果,请键入

echo 1 2 3 | ./example

4.1   错误和警告

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

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

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

5.1   轻松构建和安装

在 shell 中发出以下命令(不要键入$;它代表 shell 的提示符)

$ cd path/to/boost_1_82_0
$ ./bootstrap.sh --help

选择您的配置选项并调用./bootstrap.sh再次,无需--help选项。除非您对系统的/usr/local/目录具有写入权限,否则您可能至少需要使用

$ ./bootstrap.sh --prefix=path/to/installation/prefix

安装到其他位置。此外,请考虑使用--show-libraries--with-libraries=library-name-list 选项来限制如果您构建所有内容,您将遇到的漫长等待时间。最后,

$ ./b2 install

将 Boost 二进制文件留在安装前缀的lib/子目录中。您还将在安装前缀的include/子目录中找到 Boost 头文件的副本,因此您可以从此处使用该目录作为#include路径来代替 Boost 根目录。

跳到下一步

5.2   或者,构建自定义二进制文件

如果您使用的是系统默认编译器以外的编译器,则需要使用 Boost.Build 来创建二进制文件。

如果您需要非标准构建变体,您也需要使用此方法(有关更多详细信息,请参阅 Boost.Build 文档)。

5.2.1   安装 Boost.Build

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

  1. 转到目录tools/build/.
  2. 运行bootstrap.sh
  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 苹果电脑 苹果版本的 GCC 工具链,支持 Darwin 和 MacOS X 功能,例如框架。
gcc GNU 项目 包括对 Cygwin 和 MinGW 编译器的支持。
hp_cxx 惠普 针对 Tru64 操作系统。
intel 英特尔  
msvc 微软  
sun 甲骨文 仅最新版本才能与Boost良好兼容。请注意,Oracle/Sun 编译器有很多选项会影响二进制兼容性:库必须使用与您的应用程序相同的选项构建,这一点至关重要。尤其要注意,默认的标准库可能无法与Boost良好兼容, *除非您是为C++11构建的*。所需的特定编译器选项可以通过b2命令行选项注入。cxxflags=``和 ``linkflags=。例如,要在C++03模式下使用Apache标准库进行构建,请使用b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4.
vacpp IBM VisualAge C++编译器。

如果安装了特定编译器的多个版本,可以在工具集名称后面附加版本号,前面加一个连字符,例如:intel-9.0borland-5.4.3。 `` ``

5.2.3   选择构建目录

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

5.2.4   调用b2

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

b2 --build-dir=build-directory toolset=toolset-name `` `` stage

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

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

$ cd ~/boost_1_82_0
$ b2 --build-dir=/tmp/build-boost toolset=gcc stage

这将构建库的静态和共享非调试多线程变体。要构建所有变体,请传递附加选项“--build-type=complete”。

构建特殊的阶段目标会将Boost库二进制文件放置在阶段/lib/Boost树的子目录中。要使用不同的目录,请传递--stagedir=目录选项到b2.

注意

b2区分大小写;务必使上面以 **粗体** 显示的所有部分都完全小写。

有关调用时可以传递的其他选项的说明,请键入b2

b2 --help

特别是,为了限制构建所花费的时间,您可能需要关注

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

注意

Boost.Build可以产生大量输出,这使得很容易错过问题。如果您想确保一切顺利,您可以通过附加“>build.log 2>&1”到您的命令行中来将输出重定向到一个文件中。

5.3   预期的构建输出

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

  • 有关Boost库配置的通知——例如,如果在没有Unicode支持的情况下构建Regex库,它会输出关于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软件包的开发者希望与我们合作,以确保这些说明可以与他们的软件包一起使用,我们将非常乐意提供帮助。请将您的意向告知Boost开发者列表
[2]该选项是一个短横线后跟一个小写“L”字符,在某些字体中看起来非常像数字1。
[3]请记住,警告是特定于每个编译器实现的。给定Boost库的开发者可能无法访问您的编译器。此外,一些警告很难在通用代码中消除,以至于不值得费力。最后,有些编译器没有任何源代码机制来抑制警告。
[4]此约定将Boost库的静态版本与其具有相同名称的相同配置的Boost DLL的导入库区分开来。
[5]这些库是在没有优化或内联的情况下编译的,启用了完整的调试符号,并且没有NDEBUG #defined。虽然有时这些选择不会影响与其他已编译代码的二进制兼容性,但您不能依赖于Boost库。