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 将每个数字乘以 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.

现在,在您保存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 将在其构建过程中生成的所有中间文件都放置到**构建目录**中。如果您的 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”。

构建特殊的stage目标会将 Boost 库二进制文件放置到stage//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 时,您肯定希望我们能介绍一些其他要点。有一天,我们可能会有一本“入门系列第 2 版”来解决这些问题。在此之前,我们建议您参考以下资源。如果您找不到所需内容,或者有任何我们可以做的事情使本文档更清晰,请将其发布到Boost 用户邮件列表

继续前进

祝您好运,玩得开心!

—Boost 开发人员


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