如果您计划从 Windows 命令提示符使用您的工具,那么您来对地方了。如果您计划从 Cygwin bash shell 构建,那么您实际上是在 POSIX 平台上运行,应该遵循有关 在 Unix 变体上快速入门 的说明。其他命令 shell(例如 MinGW 的 MSYS)不受支持——它们可能有效也可能无效。
索引
获取 Boost 副本最可靠的方法是下载 boost_1_82_0.7z 或 boost_1_82_0.zip 并将其解压以安装完整的 Boost 发行版。1
这是生成的目录结构的示意图
boost_1_82_0\ .................The “boost root directory” index.htm .........A copy of www.boost.org starts here boost\ .........................All Boost Header files lib\ .....................precompiled library binaries 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
需要注意以下几点
**Boost 根目录**的路径(通常为C:\Program Files\boost\boost_1_82_0)有时在文档和邮件列表中被称为$BOOST_ROOT。
要编译 Boost 中的任何内容,您都需要一个包含boost\子目录的目录在您的#include路径中。稍后在本文件中将介绍在 Microsoft Visual Studio 中设置#include路径的具体步骤;如果您使用其他 IDE,请查阅您产品的文档以获取说明。
由于 Boost 的所有头文件都具有.hpp扩展名,并且位于boost\的 Boost 根目录的子目录中,因此您的 Boost#include指令将如下所示
#include <boost/whatever.hpp>
或
#include "boost/whatever.hpp"
这取决于您对使用尖括号包含的偏好。即使是 Windows 用户也可以(并且出于可移植性原因,可能应该)在#include指令中使用正斜杠;您的编译器不在乎。
不要被doc\子目录分心;它只包含 Boost 文档的一个子集。如果您正在寻找全部内容,请从libs\index.html开始。
许多人首先想知道的是:“如何构建 Boost?”好消息是,通常不需要构建任何内容。
无需构建?
大多数 Boost 库是**仅限头文件的**:它们 *完全由包含模板和内联函数的头文件组成*,在链接时不需要单独编译的库二进制文件或特殊处理。
唯一 *必须* 单独构建的 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.
注意
要构建本指南中的示例,您可以使用 Visual Studio 等集成开发环境 (IDE),也可以从 命令提示符 发出命令。由于每个 IDE 和编译器都有不同的选项,而 Microsoft 的编译器是 Windows 上最主要的编译器,因此我们在此处仅为 Visual Studio 2005 和 .NET 2003 IDE 及其相应的命令提示符编译器提供具体说明(使用命令提示符比较简单)。如果您使用的是其他编译器或 IDE,则应该比较容易地将这些说明调整到您的环境中。
从 Visual Studio 的 *文件* 菜单中,选择 *新建* > *项目…*。
在生成的 *新建项目* 对话框的左侧窗格中,选择 *Visual C++* > *Win32*。
在右侧窗格中,选择 *Win32 控制台应用程序* (VS8.0) 或 *Win32 控制台项目* (VS7.1)。
在 *名称* 字段中,输入“example”
右键单击 *解决方案资源管理器* 窗格中的 **example**,然后从生成的弹出菜单中选择 *属性*。
在 *配置属性* > *C/C++* > *常规* > *附加包含目录* 中,输入 Boost 根目录的路径,例如
C:\Program Files\boost\boost_1_82_0
在 *配置属性* > *C/C++* > *预编译头* 中,将 *使用预编译头 (/Yu)* 更改为 *不使用预编译头*。2
用上面的示例代码替换 IDE 生成的example.cpp的内容。
从 *生成* 菜单中,选择 *生成解决方案*。
要测试您的应用程序,请按 F5 键,然后将以下内容键入生成的窗口中,然后按 Return 键
1 2 3
然后按住 Control 键并按“Z”,然后按 Return 键。
如果你是 Visual Studio 2005 用户,请从计算机的 *开始* 菜单中选择
所有程序 > Microsoft Visual Studio 2005 > Visual Studio 工具 > Visual Studio 2005 命令提示符
或者,如果您是 Visual Studio .NET 2003 用户,请选择
所有程序 > Microsoft Visual Studio .NET 2003 > Visual Studio .NET 工具 > Visual Studio .NET 2003 命令提示符
启动一个为 Visual Studio 编译器设置的特殊命令提示符窗口。在该窗口中,将当前目录设置为适合创建一些临时文件的目录,然后键入以下命令并按回车键。
cl /EHsc /I path\to\boost_1_82_0 path\to\example.cpp
要测试结果,请键入
echo 1 2 3 | example
如果您想使用任何单独编译的 Boost 库,则需要获取库二进制文件。
如果您希望使用 Visual C++ 从源代码构建,可以使用本节中描述的简单构建过程。打开命令提示符并将当前目录更改为 Boost 根目录。然后,键入以下命令:
bootstrap .\b2
第一个命令准备使用 Boost.Build 系统。第二个命令调用 Boost.Build 来构建单独编译的 Boost 库。请参阅Boost.Build 文档以获取允许选项的列表。
如果您使用的是早期版本的 Visual C++ 或其他供应商的编译器,则需要使用Boost.Build 创建您自己的二进制文件。
Boost.Build 是一个基于文本的系统,用于开发、测试和安装软件。首先,您需要构建并安装它。为此,请执行以下操作:
首先,在下面的表格中找到与您的编译器相对应的工具集(最新的列表始终可在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.0或borland-5.4.3。**在 Windows 上,即使您只安装了一个版本,也要附加版本号**(除非您使用的是 msvc 或 gcc 工具集,它们具有特殊的版本检测代码),否则自动链接将失败。
Boost.Build 将在其构建过程中生成的全部中间文件放置到**build 目录**中。如果您的 Boost 根目录是可写的,则此步骤并非严格必要:默认情况下,Boost.Build 将在您的当前工作目录中为此目的创建一个bin.v2/子目录。
将当前目录更改为 Boost 根目录并调用:b2如下所示:
b2 --build-dir=build-directory toolset=toolset-name --build-type=complete stage
有关这些和其他调用选项的完整说明,请参见Boost.Build 文档。
例如,您的会话可能如下所示:3
C:\WINDOWS> cd C:\Program Files\boost\boost_1_82_0 C:\Program Files\boost\boost_1_82_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 用户邮件列表。
构建特殊的阶段目标会将 Boost 库二进制文件放置在阶段\lib\Boost 树的子目录中。要使用不同的目录,请将--stagedir=directory 选项传递给b2.
注意
b2区分大小写;务必使上面以**粗体**显示的所有部分完全是小写。
有关调用时可以传递的其他选项的说明,请键入:b2
b2 --help
特别是,为了限制构建所花费的时间,您可能希望
注意
Boost.Build 可以产生大量的输出,这使得很容易错过问题。如果您想确保一切顺利,您可以通过附加“>build.log 2>&1”到您的命令行来将输出重定向到文件。
在构建 Boost 库的过程中,您可以预期会在控制台上看到一些打印的消息。这些可能包括:
有关 Boost 库配置的通知——例如,如果在没有 Unicode 支持的情况下构建 Regex 库,它会输出关于 ICU 的消息,如果没有安装 Python,则可能会跳过 Python 库而不会出错(但会发出通知)。
来自构建工具的消息,报告已构建或跳过的目标数量。如果这些数字对您没有任何意义,请不要感到惊讶;每个库都有许多目标。
描述工具正在执行的操作的构建操作消息,看起来像这样:
toolset-name.c++ long/path/to/file/being/built
编译器警告。
构建 Boost 时看到的唯一错误消息(如果有的话)应该与 IOStreams 库对 zip 和 bzip2 格式的支持有关,如此处所述。如果您需要这些功能,请安装 libz 和 libbz2 的相关开发包。构建 Boost 库时出现的其他错误值得关注。
如果构建系统似乎找不到您的编译器和/或链接器,请考虑设置一个user-config.jam文件,如此处所述。如果这不是您的问题,或者该user-config.jam文件对您不起作用,请向Boost 用户邮件列表咨询有关为您的编译器配置 Boost 的问题。
为了演示与 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; } }
链接有两个主要挑战:
自动链接
大多数 Windows 编译器和链接器都有所谓的“自动链接支持”,这消除了第二个挑战。Boost 头文件中的特殊代码检测您的编译器选项,并使用这些信息将正确库的名称编码到您的目标文件中;链接器从您已告诉它搜索的目录中选择具有该名称的库。
GCC 工具链(Cygwin 和 MinGW)是值得注意的例外;GCC 用户应参考Unix 变体操作系统的链接说明以获取要使用的适当命令行选项。
从我们之前创建的仅限头文件的示例项目开始
例如,我们可以通过简单地将下面的**粗体**文本添加到我们之前使用的命令行来从 Visual C++ 命令行编译和链接上述程序,假设您的 Boost 二进制文件位于C:\Program Files\boost\boost_1_82_0\lib:
cl /EHsc /I path\to\boost_1_82_0 example.cpp ^ /link /LIBPATH:C:\Program Files\boost\boost_1_82_0\lib
为了选择适合您的构建配置的正确二进制文件,您需要了解 Boost 二进制文件的命名方式。每个库文件名都由一系列描述其构建方式的常用元素组成。例如,libboost_regex-vc71-mt-d-x86-1_34.lib可以分解为以下元素:
ABI 标签:编码影响库与其他编译代码互操作性的细节。对于每个这样的特性,都会向标签中添加一个字母。
键 在以下情况下使用此库 Boost.Build 选项 s 静态链接到 C++ 标准库和编译器运行时支持库。 runtime-link=static g 使用标准库和运行时支持库的调试版本。 runtime-debugging=on y 使用特殊的Python 调试版本。 python-debugging=on d 构建代码的调试版本。6 variant=debug p 使用 STLPort 标准库而不是编译器提供的默认标准库。 stdlib=stlport
例如,如果您构建代码的调试版本以与静态运行时库和 STLPort 标准库的调试版本一起使用,则标签将为-sgdp。如果以上情况都不适用,则省略 ABI 标签。
架构和地址模型标签:第一个字母编码架构,如下所示
键 架构 Boost.Build 选项 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
后面的两位数字编码地址模型,如下所示
键 地址模型 Boost.Build 选项 32 32 位 address-model=32 64 64 位 address-model=64
为了测试我们的主题提取,我们将过滤以下文本文件。将其复制到浏览器之外并将其保存为jayne.txt:
To: George Shmidlap From: Rita Marlowe Subject: Will Success Spoil Rock Hunter? --- See subject.
现在,在命令提示符窗口中,键入
path\to\compiled\example < path\to\jayne.txt
程序应该以电子邮件主题“Will Success Spoil Rock Hunter?”进行响应。
本节介绍了 Boost 以及如何将其与您的程序集成。当您开始认真使用 Boost 时,肯定还有一些其他要点您希望我们已经介绍过。将来我们可能会有一本“入门系列第 2 部分”来解决这些问题。在此之前,我们建议您参考以下资源。如果您找不到需要的内容,或者有什么我们可以做的事情使本文件更清晰,请将其发布到Boost 用户邮件列表。
继续前进
祝你好运,玩得开心!
——Boost 开发者
[1] | 我们建议下载boost_1_82_0.7z并使用7-Zip解压缩它。我们不再推荐 Boost 的 .zip 文件,因为它们的大小是等效 .7z 文件的两倍。我们不建议使用 Windows 自带的解压缩程序,因为它对于大型存档来说可能非常慢。 |
[2] | 使用预编译头与 Boost 一起使用没有问题;这些说明只是避免使用预编译头,因为这需要对示例中使用的源代码进行 Visual Studio 特定的更改。 |
[3] | 在这个例子中,脱字符号^是一种在多行上继续命令的方法,并且必须是用于继续行的**最后一个字符**(即,不要在其后跟空格)。命令提示符将以More?提示输入更多内容。您可以随意省略脱字符号和后续换行符;我们使用它们是为了使示例适合合理宽度的页面。 命令提示符将命令中的每个空格都视为参数分隔符。这意味着引号(")需要将文本放在一起,每当单个命令行参数包含空格时,就像在 --build-dir="C:\Documents_and_Settings\dave\build-boost" 中一样。例如,您不能在=符号周围添加空格,就像在 --build-dir_=_"C:\Documents and Settings\dave\build-boost" |
[4] | 中一样。请记住,警告特定于每个编译器实现。给定 Boost 库的开发人员可能无法访问您的编译器。此外,一些警告在通用代码中非常难以消除,以至于不值得费力。最后,有些编译器没有任何用于抑制警告的源代码机制。 |
[5] | 此约定将 Boost 库的静态版本与配置相同的 Boost DLL 的导入库区分开来,否则它们将具有相同的名称。 |
[6] | 这些库是在没有优化或内联的情况下编译的,启用了完整的调试符号,并且没有NDEBUG #defined。虽然有时这些选择不会影响与其他编译代码的二进制兼容性,但您不能依赖 Boost 库的这一点。 |