Boost C++ 库

……世界上评价最高、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码标准

Boost 在 Unix 变体上的入门指南 - Boost 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 库是

少数库有可选的单独编译的二进制文件

  • Boost.Graph 还有一个二进制组件,仅在您打算 解析 GraphViz 文件时才需要。
  • Boost.Math 包含 TR1 和 C99 cmath 函数的二进制组件。
  • Boost.Random 有一个二进制组件,仅在您使用random_device.
  • 时才需要。Boost.Test 可以以“仅标头文件”或“单独编译”模式使用,尽管对于严肃的使用,建议单独编译
  • Boost.Exception 为 32 位 _MSC_VER==1310 和 _MSC_VER==1400 提供了 exception_ptr 的非侵入式实现,这需要一个单独编译的二进制文件。这通过 #define BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR 来启用。
  • Boost.System 自 Boost 1.69 起为仅标头文件。仍然会构建一个存根库以实现兼容性,但不再需要链接到它。

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

来安装到其他地方。另外,请考虑使用通过and--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添加到您的 PATH 环境变量中。/bin首先,在以下表中找到与您的编译器对应的工具集(始终可以在Boost.Build 文档中找到最新列表)。

5.2.2   确定您的工具集

如果您先前为构建 b2 的目的选择了一个工具集,您应该假设它不起作用,而是从下表中重新选择。

注意

工具集名称

供应商 acc 注意
Hewlett Packard 只有非常近期的版本已知能与 Boost 良好配合 borland
Borland como  
Comeau Computing 使用此工具集可能需要配置另一个工具集作为其后端。 darwin
Apple Computer Apple 的 GCC 工具链版本,支持 Darwin 和 MacOS X 功能(如框架)。 GNU 项目
gcc 包括对 Cygwin 和 MinGW 编译器的支持。 hp_cxx
针对 Tru64 操作系统。 只有非常近期的版本已知能与 Boost 良好配合 intel
Intel msvc  
Microsoft Oracle  
sun 只有非常近期的版本已知能与 Boost 良好配合。请注意,Oracle/Sun 编译器有大量的选项会影响二进制兼容性:库必须使用与您的应用程序将使用的相同选项构建,这一点至关重要。特别是要意识到默认的标准库可能与 Boost 工作不佳,除非您正在为 C++11 构建。您需要的特定编译器选项可以通过 b2 命令行选项注入 只有非常近的版本已知能很好地与 Boost 一起工作。请注意,Oracle/Sun 编译器有大量的选项会影响二进制兼容性:库的构建必须使用与你的应用程序将使用的相同的选项。特别要注意的是,默认的标准库可能与 Boost 工作不佳,*除非你正在为 C++11 构建*。你需要的特定编译器选项可以通过 b2 命令行选项注入:。例如,要使用 Apache 标准库以 C++03 模式构建,请使用b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4vacpp.
IBM VisualAge C++ 编译器。 如果您安装了同一编译器的多个版本,您可以将版本号附加到工具集名称后,前面加上连字符,例如

intel-9.0borland-5.4.3在 Windows 上,即使您只有一个编译器版本,也要附加版本号(除非您使用 msvc 或 gcc 工具集,它们有特殊的版本检测代码),否则自动链接将失败。. `` ``

5.2.3   选择构建目录

Boost.Build 会将它在构建过程中生成的所有中间文件放在 **构建目录** 中。如果你的 Boost 根目录是可写的,则此步骤不是必需的:默认情况下,Boost.Build 会创建一个子目录用于此目的。将当前目录更改为 Boost 根目录,然后调用

5.2.4   调用b2

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

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

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

例如,你的会话可能看起来像这样:

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

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

目标会将 Boost 库的二进制文件放置在 Boost 树的lib子目录中。要使用不同的目录,请将lib/--stagedir=/directory 选项传递给对大小写敏感;确保所有上面用粗体显示的单词都全部小写很重要。有关调用b2.

注意

b2时可以传递的其他选项的描述,请键入

特别是,为了限制构建所花费的时间,您可能对b2通过

b2 --help

--show-libraries

  • 查看库名称列表通过
  • --with-library-name--without-library-name 选项限制要构建的库通过在命令行中添加
  • 来选择特定的构建变体。releasedebugBoost.Build 会产生大量的输出,这可能很容易让人忽略问题。如果您想确保一切顺利,可以将输出重定向到一个文件,方法是在命令行末尾添加“

注意

>build.log 2>&1”。在构建 Boost 库的过程中,您可能会在控制台上看到一些消息。这些消息可能包括

5.3   预期的构建输出

关于 Boost 库配置的通知—例如,Regex 库在未构建 Unicode 支持时会输出关于 ICU 的消息,如果未安装 Python,Python 库可能会被跳过而不会报错(但会附带通知)。

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

  • 描述工具正在做什么的构建操作消息,看起来像

  • 编译器警告。

    toolset-name.c++ long/path/to/file/being/built
    
  • 在构建 Boost 库时您可能看到的唯一错误消息(如果有)应该与 IOStreams 库对 zip 和 bzip2 格式的支持有关,如此处所述。如果您需要这些功能,请安装 libz 和 libbz2 的相应开发包。构建 Boost 库时出现其他错误则需要引起关注。

5.4   在构建错误的情况下

如果你在构建 Boost 时看到任何错误消息,应该都与 IOStreams 库对 zip 和 bzip2 格式的支持有关,具体描述 在此。如果你需要这些功能,请安装 libz 和 libbz2 的相关开发包。构建 Boost 库时的其他错误是值得关注的。

user-config.jam文件,如此处所述。如果这不是您的问题,或者该文件对您不起作用,请将关于为您的编译器配置 Boost 的问题提交给Boost 用户邮件列表文件,如此处所述。如果这不是您的问题,或者该为了演示链接到一个 Boost 二进制库,我们将使用以下简单的程序,该程序从电子邮件中提取主题行。它使用了Boost.Regex 库,该库有一个单独编译的二进制组件。

7   结论和进一步的资源

这标志着你对 Boost 和将其集成到你的程序中的介绍的结束。当你开始认真使用 Boost 时,肯定会有一些你想让我们涵盖的附加要点。有一天我们可能会有一个“入门系列第二册”来处理它们。在此之前,我们建议你查阅以下资源。如果你找不到需要的东西,或者有什么我们可以让这份文档更清晰的,请将其发布到 Boost 用户邮件列表

继续前进

祝您好运,玩得开心!

—Boost 开发者

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