Boost C++ 库

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

在 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=库名称列表 选项来限制您构建所有内容时将经历的漫长等待。最后,

$ ./b2 install

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

跳到下一步

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 Hewlett Packard 只有非常新的版本已知可以与 Boost 良好配合使用
borland Borland  
como Comeau Computing 使用此工具集可能需要 配置 另一个工具集作为其后端。
darwin Apple Computer Apple 版本的 GCC 工具链,支持 Darwin 和 MacOS X 功能,如框架。
gcc Gnu 项目 包括对 Cygwin 和 MinGW 编译器的支持。
hp_cxx Hewlett Packard 目标是 Tru64 操作系统。
intel Intel  
msvc Microsoft  
sun Oracle 只有非常新的版本已知可以与 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 库二进制文件放置在 Boost 树的stage/lib/子目录中。要使用不同的目录,请将--stagedir=目录 选项传递给b2.

注意

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

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

b2 --help

特别是,为了限制花费在构建上的时间,您可能有兴趣

  • 使用--show-libraries
  • 查看库名称列表,使用--with-库名称--without-库名称 选项来限制构建哪些库
  • 通过添加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   结论和更多资源

程序应该响应电子邮件主题,“Will Success Spoil Rock Hunter?”

所有 Boost 库文档的索引

前进

祝您好运,玩得开心!


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