Boost(1.69.0) windows入门(译)

缩进2字符

Boost windows入门

基于版本1.69.0html

1. 得到Boost源代码

获取Boost副本最好的方法是下载boost_1_69_0.7zboost_1_69_0.zip并解压缩以安装完整的Boost发行版。python

2. Boost源代码组织 The Boost Distribution

这是Boost目录结构草图:ios

boost_1_69_0 \ ........................ “boost根目录” 
   index.htm ................ 这是www.boost.org的副本
   boost \ ......................... 全部Boost 头文件
   lib \ .......................... 预编译库二进制文件
   libs\ ................. 测试,.cpps,docs等,经过库
     index.html ..................... 库文档从这里开始
     algorithm\ 
     any \ 
     array \ 
                     ...更多库... 
   status\ .........................Boost-wide测试套件
   tools\ ........... 实用工具,例如Boost.Build,quickbook,bcp 
   more \ ................................. 政策文件等
   doc \ ........................ 全部Boost库文档的子集
标题组织
Boost库头的组织并不彻底统一,但大多数库遵循如下几种模式:
- 一些较旧的库和大多数很是小的库将全部公共头文件直接放入 `boost\`。
- 大多数库的公共头文件都位于`boost\`的子目录中,以库命名。例如,您将在中找到Python库的`def.hpp`标头
.    boost\python\def.hpp.
- 有些库在`boost\`中有一个“聚合头”,即`#include`全部库的其余头文件。例如,`Boost.Python`的聚合头是
.    boost\python.hpp.
- 大多数库将私有头放在名为 `detail\` 或 `aux_\` 的子目录中。不要期望在这些目录中找到任何可使用的东西。

重要的是要注意如下几点:c++

  1. boost根目录(boost root directory)(一般是C:\Program Files\boost\boost_1_69_0)有时在boost文档和邮件列表中也称为$BOOST_ROOT
  2. 要在Boost中编译任何内容,您须要在include目录中包含boost\子目录。 在Microsoft Visual Studio中设置include路径的具体步骤将在本文档的后面部分中介绍; 若是您使用其余IDE,请参阅产品文档以获取相关说明。
  3. 因为全部Boost头文件都具备.hpp扩展名,而且位于boost根目录下的boost\子目录中,所以你的Boost #include指令将以下所示:
#include <boost/whatever.hpp>

shell

#include "boost/whatever.hpp"

取决于您对使用尖括号的偏好包括。即便是Windows用户也能够(而且出于可移植性的缘由,可能)在#include指令中使用正斜杠(forward slashes); 你的编译器不关心。bootstrap

  1. 不要被doc\子目录分散注意力; 它只包含Boost文档的子集。若是要查看完整的文件,从 libs\index.html 开始。

3. 仅用头文件的库 Header-Only Libraries

许多人想要知道的第一件事是,“我如何构建Boost?”好消息是,一般没有什么可构建的。windows

什么都没有创建?

大多数Boost库只是头文件:它们彻底由包含模板和内联函数的头文件组成,而且在连接时不须要单独编译的库二进制文件或特殊处理。

必须单独构建的Boost库是:浏览器

  • Boost.Chrono
  • Boost.Context
  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.Locale
  • Boost.Log (see build documentation)
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python (see the Boost.Python build documentation before building and installing it)
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Timer
  • Boost.Wave

一些库具备可选的单独编译的二进制文件:多线程

  • Boost.DateTime有一个二进制组件,只有在使用其to_string/from_string或序列化功能时才须要,或者若是你的目标是Visual C ++ 6.xBorland
  • 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启用的。

4. 使用Boost构建一个简单的程序 Build a Simple Program Using 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的文件中。

注意

要构建本指南中的示例,您可使用Visual Studio等集成开发环境(IDE),也能够从命令提示符发出命令。因为每一个IDE和编译器都有不一样的选项,而微软是迄今为止Windows上的主要编译器,咱们只为Visual Studio 2005和.NET 2003 IDE以及它们各自的命令提示符编译器提供了具体指示(使用命令提示符稍微简单一点)。若是您使用的是其余编译器或IDE,则能够相对轻松地将这些指令调整到您的环境中。

4.1 使用Visual Studio IDE构建

命令提示符基础知识

在Windows中,经过在命令提示符窗口中键入其名称(后跟可选参数)并按Return(或Enter)键来调用命令行工具。
若要打开通用命令提示符,请单击`“开始”`菜单按钮,单击`“运行”`,键入`“cmd”`,而后单击`“肯定”`。
全部命令都在文件系统中`当前目录`的上下文中执行。要设置`当前目录`,请键入:
. cd /d path\to\some\directory
而后返回。例如,
. cd /d E:\dev\VS2017\boost_1_69_0
经过在除最后一行以外的全部行的末尾键入插入符号(^),能够在多行中继续执行长命令。本文的一些示例使用该技术来节省水平空间。
  • 从Visual Studio 2017的“文件”菜单中,选择“新建” > “项目”...
  • 在生成的“新建项目”对话框的左侧窗格中,选择“已安装” > “Visual C++” > “Windows桌面”。
  • 在右侧窗格中,选择 Win32控制台应用程序
  • 在名称字段中,输入example_boost
  • 右键单击“解决方案资源管理器”窗格中的example_boost,而后从弹出的菜单中选择“属性”
  • 在 “配置属性” > “C/C++” > “常规” > “其余包含目录” 中,输入Boost根目录的路径
E:\dev\VS2017\boost_1_69_0
  • 在“配置属性” > “C/C++” > “预编译标题”中,将“使用预编译标题(/Yu)”更改成“不使用预编译标题”。
  • 使用上面的示例代码替换IDE生成的example.cpp的内容。
  • 从Build菜单中,选择Build Solution。

要测试您的应用程序,请按F5键并在结果窗口中键入如下内容,而后按Return键:

1 2 3

而后按住控制键并按“Z”,而后按Return键。

4.2 从命令提示符构建 Or, Build From the Command Prompt

从计算机的“开始”菜单中,若是您是Visual Studio 2017用户,请选择

.  Visual Studio 2017 > 适用于 VS 2017 的 x64 本机工具命令提示

为Visual Studio编译器调出一个特殊的命令提示符窗口。在该窗口中,将当前目录设置为适合建立一些临时文件的位置,而后键入如下命令,后跟Return键:

cl /EHsc /I E:\dev\VS2017\boost_1_69_0 D:\Users\yaoyu\source\repos\example_boost\example_boost\example_boost.cpp

要测试结果,请键入:

echo 1 2 3 | example_boost

4.3 错误和警告 Errors and Warnings

若是您看到源自Boost头文件的编译器警告,请不要惊慌。咱们试图消除它们,但这样作并不老是实用的。错误是另外一回事。若是您在本教程中看到编译错误,请检查以确保您已正确复制示例程序而且已正确识别Boost根目录

5 准备使用Boost Library Binary

若是要使用任何单独编译的Boost库,则须要获取库二进制文件。

5.1 使用源代码简单构建

若是您但愿使用Visual C++从源代码构建,可使用本节中描述的简单构建过程。打开命令提示符并将当前目录更改成Boost根目录(Boost root directory)。而后,键入如下命令:

bootstrap
.\b2

第一个命令准备Boost.Build系统以供使用。第二个命令调用Boost.Build来构建单独编译的Boost库。有关容许的选项列表,请参阅Boost.Build文档。

5.2 从源构建二进制文件

若是您使用的是早期版本的Visual C++或其余供应商的编译器,则须要使用Boost.Build来建立本身的二进制文件。

5.2.1 安装Boost.Build

Boost.Build是一个基于文本的系统,用于开发,测试和安装软件。首先,您须要构建并安装它。步骤以下:

  1. 转到目录tools\build\
  2. 运行bootstrap.bat
  3. 运行b2 install --prefix=PREFIX, 其中PREFIX是您但愿安装Boost.Build的目录
  4. PREFIX\bin添加到PATH环境变量中。

5.2.2 肯定工具集 Identify Your Toolset

首先,在下表中找到与编译器对应的工具集(Boost.Build文档中始终提供最新列表)。


注意

若是您以前为了构建b2而选择了一个工具集,那么您应该假设它不起做用,而是从下表中新选择。

Toolset Name Vendor Notes
acc Hewlett Packard Only very recent versions are known to work well with Boost
borland Borland  
como Comeau Computing Using this toolset may require configuring another toolset to act as its backend.
darwin Apple Computer Apple's version of the GCC toolchain with support for Darwin and MacOS X features such as frameworks.
gcc The Gnu Project Includes support for Cygwin and MinGW compilers.
hp_cxx Hewlett Packard Targeted at the Tru64 operating system.
intel Intel  
msvc Microsoft  
sun Oracle Only very recent versions are known to work well with Boost. Note that the Oracle/Sun compiler has a large number of options which effect binary compatibility: it is vital that the libraries are built with the same options that your appliction will use. In particular be aware that the default standard library may not work well with Boost, unless you are building for C++11. The particular compiler options you need can be injected with the b2 command line options cxxflags=``and ``linkflags=. For example to build with the Apache standard library in C++03 mode use b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4.
vacpp IBM The VisualAge C++ compiler.

若是安装了特定编译器的多个版本,则能够将版本号附加到工具集名称,后面加一个连字符,例如intel-9.0或borland-5.4.3。在Windows上,即便您只安装了一个版本(除非您使用的是具备特殊版本检测代码的msvc或gcc工具集),不然auto-linking会失败。

5.2.3 选择构建目录 Select a Build Directory

Boost.Build会将构建时生成的全部中间文件放入构建目录(build directory)中。若是您的Boost根目录是可写的,则此步骤不是必需的:默认状况下,Boost.Build将在您当前的工做目录中为此建立bin.v2/子目录。

5.2.4 调用b2 Invoke b2

将当前目录更改成Boost根目录, 并按以下方式调用b2:

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

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

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

C:\WINDOWS> cd /d C:\Program Files\boost\boost_1_69_0
C:\Program Files\boost\boost_1_69_0> b2 ^
More? --build-dir="C:\Documents and Settings\dave\build-boost" ^
More? --build-type=complete msvc stage

请务必阅读关于^, More?和该行中的引号(“)的说明

选项 --build-type=complete 会让Boost.Build构建全部支持的库版本。有关如何仅构建特定版本的说明,请在Boost.Build邮件列表中查询。

构建特殊阶段(stage)目标将Boost库二进制文件放在Boost树的stage\lib\子目录中。要使用其余目录,请将--stagedir=directory选项传递给b2。

注意
b2区分大小写; 重要的是,上面以 粗体显示的全部部件都是彻底小写的。

有关在调用b2时能够传递的其余选项的说明 ,请键入:

b2 --help

特别是,为了限制建设所花费的时间,您可能会对如下内容感兴趣:

  • 使用--show-libraries查看库名列表
  • 使用--with-library-name--without-library-name选项选择要构建(或不构建)的库
  • 经过向命令行添加releasedebug来选择特定的构建版本。
注意
Boost.Build能够产生大量的输出,这能够很容易地错过问题。若是要确保一切顺利,能够经过在命令行中附加 `> build.log 2>&1` 将输出重定向到文件中。

5.3 预期的构建输出 Expected Build Output

在构建Boost库的过程当中,您能够指望在控制台上看到一些消息。这些可能包括

  • 关于Boost库配置的注意事项 - 例如,Regex库在没有Unicode支持的状况下生成有关ICU的消息,若是没有安装Python,能够跳过Python库而不会出现错误(但须要注意)。
  • 来自构建工具的消息,用于报告已构建或跳过的目标数。若是这些数字对你没有任何意义,不要感到惊讶; 每一个库有不少目标。
  • 构建描述工具正在作什么的动做消息,以下所示:
toolset-name.c++ long/path/to/file/being/built
  • 编译器警告。

5.4 在构建错误的状况下 In Case of Build Errors

在构建Boost时看到的惟一错误消息(若是有的话)应该与IOStreams库对zip和bzip2格式的支持有关。若是须要这些特性,请安装libz和libbz2的相关开发包。构建Boost库时的其余错误也值得关注。

若是它看起来像编译系统没法找到你的编译器和/或链接器,考虑设置一个user-config.jam文件。若是这不是您的问题或user-config.jam文件不工做,请解决有关将编译器的Boost配置到Boost.Build邮件列表的问题。

6 将您的程序连接到Boost Library

为了演示与Boost二进制库的连接,咱们将使用如下简单程序从电子邮件中提取主题行。它使用Boost.Regex库,它具备单独编译的二进制组件。

#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string line;
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
}

连接有两个主要挑战:

  • 工具配置,例如, 选择命令行选项或IDE构建设置。
  • 在全部构建版本中识别库二进制文件,其编译配置与项目的其他部分兼容。
自动连接
大多数Windows编译器和连接器都具备所谓的“自动连接支持”(auto-linking support),这消除了第二个挑战。Boost头文件中的特殊代码检测您的编译器选项,并使用该信息将正确库的名称编码到目标文件中; 连接器从您告诉它搜索的目录中选择具备该名称的库。
GCC工具链(Cygwin和MinGW)是值得注意的例外; GCC用户应参考[ linking instructions for Unix variant OSes ](https://www.boost.org/doc/libs/1_69_0/more/getting_started/unix-variants.html#link-your-program-to-a-boost-library),以获取相应的命令行选项。

6.1 从Visual Studio IDE中连接

从咱们以前建立的仅头文件example项目开始:

  1. 右键单击“解决方案资源管理器”窗格中的example,而后从弹出的菜单中选择“属性”
  2. 配置属性 > 连接器 > 附加库目录中,输入Boost二进制文件的路径,例如E:\dev\VS2017\boost_1_69_0\lib64-msvc-14.1
  3. 从Build菜单中,选择Build Solution。

6.2 从命令提示符连接

例如,假设您的Boost二进制文件位于E:\dev\VS2017\boost_1_69_0\lib64-msvc-14.1中,咱们能够经过简单地将下面的粗体文本添加到咱们以前使用的命令行,从Visual C++命令行编译和连接上述程序。:

cl /EHsc /I E:\dev\VS2017\boost_1_69_0 example_boost.cpp   ^
     /link /LIBPATH:E:\dev\VS2017\boost_1_69_0\lib64-msvc-14.1

6.3 库命名 Library Naming

自动连接
若是像Visual C++同样,您的编译器支持自动连接,您能够跳到下一步。

为了配置正确的二进制文件,您须要知道Boost二进制文件是如何命名的。每一个库文件名由一组共同的元素序列组成,这些元素描述了它的构建方式。例如,libboost_regex-vc71-mt-d-x86-1_34.lib能够分解为如下元素:

lib


前缀(Prefix):除Microsoft Windows外,每一个Boost库名称都以此字符串开头。在Windows上,只有普通的静态库(ordinary static libraries)使用lib前缀; 导入库和DLL没有。

boost_regex


库名(Library name):全部boost库文件名都以boost_开头。

-vc71


工具集标记(Toolset tag):标识用于构建二进制文件的工具集和版本。

-mt


线程标记(Threading tag):表示库是在启用多线程(multithreading)支持的状况下构建的。没有多线程支持而构建的库能够经过去掉 -mt 来识别。

-d


ABI标记:对影响库与其余编译代码的互操做性的细节进行编码。对于每一个此类功能,标记中都会添加一个字母:

Key Use this library when: Boost.Build option
s linking statically to the C++ standard library and compiler runtime support libraries. runtime-link=static
g using debug versions of the standard and runtime support libraries. runtime-debugging=on
y using a special debug build of Python. python-debugging=on
d building a debug version of your code.6 variant=debug
p using the STLPort standard library rather than the default one supplied with your compiler. stdlib=stlport

例如,若是构建代码的调试版本以用于静态运行时库和STLPort标准库的调试版本,则标记将为:-sgdp。若是以上都不适用,则省略ABI标记。

-x86


体系结构和地址模式标记(Architecture and address model tag):在第一个字母中,对体系结构进行以下编码:

Key Architecture Boost.Build option
x x86-32, x86-64 architecture=x86
a ARM architecture=arm
i IA-64 architecture=ia64
s Sparc architecture=sparc
m MIPS/SGI architecture=mips*
p RS/6000 & PowerPC architecture=power

字母后面的两位数字对地址模型进行编码,以下所示:

Key Address model Boost.Build option
32 32 bit address-model=32
64 64 bit address-model=64

-1_34


版本标签(Version tag):完整的Boost版本号,点号由下划线替换。例如,版本1.31.1将标记为“-1_31_1”。

.lib


扩展名(Extension):根据操做系统的惯例肯定。在大多数unix风格的平台上,扩展名分别为 .a 和 .so,分别用于静态库(归档)和共享库。在Windows上,.dll表示共享库,.lib表示静态库或导入库。在unix变体上的工具集支持的状况下,添加完整版本扩展(例如“.so.1.34”),而且还将建立指向没有尾随版本号的库文件的符号连接。

6.4 测试 Test Your Program

为了测试咱们的主题提取,咱们将过滤如下文本文件。将其从浏览器中复制并保存为jayne.txt

To: George Shmidlap
From: Rita Marlowe
Subject: Will Success Spoil Rock Hunter?
---
See subject.

如今,在命令提示符窗口中,键入:

path\to\compiled\example < path\to\jayne.txt
D:\Users\yaoyu\source\repos\example_boost\example_boost>example_boost.exe < jayne.txt

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

7 结论和进一步的资源 Conclusion and Further Resources

最后介绍了Boost并将其与您的程序集成。当你开始认真地使用Boost时,确定会有一些你但愿咱们覆盖的额外点。有一天,咱们可能会在“入门系列”中找到“第2册”来解决这些问题。在此以前,咱们建议您继续使用如下资源。若是您没法找到所需内容,或者咱们能够采起任何措施使此文档更加清晰,请将其发布到Boost用户的邮件列表中。

向前 Onward

祝好运并玩得开心点! Good luck, and have fun!

— the Boost Developers

相关文章
相关标签/搜索