如果您打算从 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路径。设置的后续具体步骤#include在 Microsoft Visual Studio 中的路径将在本文档的后面给出;如果您使用其他 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 编译器设置的特殊 命令提示符 窗口。在该窗口中,将 当前目录 设置为创建一些临时文件的合适位置,然后键入以下命令后跟 Return 键
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 是一个用于开发、测试和安装软件的基于文本的系统。首先,您需要构建并安装它。要做到这一点
如果您先前为构建 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 工具集,它们有特殊的版本检测代码),否则自动链接将失败。。**在 Windows 上,即使您只安装了一个版本,也要附加版本号**(除非您使用的是 msvc 或 gcc 工具集,它们具有特殊的版本检测代码),否则 自动链接将失败。
Boost.Build 将在其构建过程中生成的所有中间文件放置在**构建目录**中。如果您的 Boost 根目录是可写的,则此步骤不是严格必需的:默认情况下,Boost.Build 将创建一个子目录用于此目的。将当前目录更改为 Boost 根目录,然后调用
如下b2有关这些和其他调用选项的完整描述,请参阅Boost.Build 文档。
b2 --build-dir=build-directory toolset=toolset-name --build-type=complete stage
例如,您的会话可能如下所示:3
例如,您的会话可能看起来像这样: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
请务必阅读 这条关于出现^, 更多?和引号(")在该行中的说明。
选项“**--build-type=complete**”会导致 Boost.Build 构建所有支持的库变体。有关如何仅构建特定变体的说明,请在 Boost 用户邮件列表 上提问。
目标会将 Boost 库的二进制文件放置在 Boost 树的lib子目录中。要使用不同的目录,请将lib\--stagedir=\directory 选项传递给对大小写敏感;确保所有上面用粗体显示的单词都全部小写很重要。有关调用b2.
注意
b2时可以传递的其他选项的描述,请键入
特别是,为了限制构建所花费的时间,您可能对b2通过
b2 --help
--show-libraries
注意
>build.log 2>&1”。在构建 Boost 库的过程中,您可能会在控制台上看到一些消息。这些消息可能包括
关于 Boost 库配置的通知—例如,Regex 库在未构建 Unicode 支持时会输出关于 ICU 的消息,如果未安装 Python,Python 库可能会被跳过而不会报错(但会附带通知)。
构建工具报告已构建或已跳过的目标数量的消息。如果这些数字对您没有意义,请不要感到惊讶;每个库都有许多目标。
描述工具正在做什么的构建操作消息,看起来像
编译器警告。
toolset-name.c++ long/path/to/file/being/built
在构建 Boost 库时您可能看到的唯一错误消息(如果有)应该与 IOStreams 库对 zip 和 bzip2 格式的支持有关,如此处所述。如果您需要这些功能,请安装 libz 和 libbz2 的相应开发包。构建 Boost 库时出现其他错误则需要引起关注。
您在构建 Boost 时看到的唯一错误消息(如果有)应该与 IOStreams 库对 zip 和 bzip2 格式的支持有关,如此处所述。如果您需要这些功能,请安装 libz 和 libbz2 的相关开发包。构建 Boost 库时出现其他错误则需要引起关注。
user-config.jam文件,如此处所述。如果这不是您的问题,或者该文件对您不起作用,请将关于为您的编译器配置 Boost 的问题提交给Boost 用户邮件列表。文件,如此处所述。如果这不是您的问题,或者该为了演示链接到一个 Boost 二进制库,我们将使用以下简单的程序,该程序从电子邮件中提取主题行。它使用了Boost.Regex 库,该库有一个单独编译的二进制组件。
为了演示链接 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 编译器和链接器都具有所谓的“自动链接支持”,这消除了第二个挑战。Boost 头文件中的特殊代码会检测您的编译器选项,并利用这些信息将正确的库名编码到您的对象文件中;链接器会从您告诉它搜索的目录中选择具有该名称的库。
GCC 工具链(Cygwin 和 MinGW)是显著的例外;GCC 用户应参考 Unix 变体 OS 的链接说明以获取要使用的适当命令行选项。
从我们之前创建的 仅头文件示例项目开始
例如,我们可以通过在之前使用的命令行中简单地添加下面**粗体**文本来从 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
libboost_regex-vc71-mt-d-x86-1_34.lib可以分解为以下元素前缀:在 Microsoft Windows 上,所有 Boost 库名都以这个字符串开头。在 Windows 上,只有普通静态库使用
当使用以下情况时使用此库
键 Boost.Build 选项 静态链接到 C++ 标准库和编译器运行时支持库。 s runtime-link=static g 使用标准和运行时支持库的调试版本。 runtime-debugging=on 使用特殊的Python 调试构建。 y python-debugging=on 构建您代码的调试版本。6 d 构建代码的调试版本。6 使用 STLPort 标准库而不是编译器随附的默认库。 p stdlib=stlport 例如,如果您构建一个调试版本的代码,用于与静态运行时库的标准库和 STLPort 标准库的调试版本一起使用,则标签将是
-sgdp。如果以上都不适用,则 ABI 标签将被省略。-x86
体系结构
键 x86-32, x86-64 静态链接到 C++ 标准库和编译器运行时支持库。 x architecture=x86 ARM a architecture=arm IA-64 i architecture=ia64 Sparc s architecture=sparc MIPS/SGI m architecture=mips* RS/6000 & PowerPC p architecture=power 字母后面的两位数字编码地址模型,如下所示
地址模型
键 32 位 静态链接到 C++ 标准库和编译器运行时支持库。 32 address-model=32 64 位 64 address-model=64 版本标签:完整的 Boost 发布号,小数点用下划线替换。例如,版本 1.31.1 将标记为“-1_31_1”。
为了测试我们的主题提取,我们将过滤以下文本文件。将其从浏览器中复制出来并保存为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 时,肯定还有一些您希望我们涵盖的额外要点。有一天我们可能会有一个“入门系列第二卷”来解决这些问题。在此之前,我们建议您查阅以下资源。如果您找不到所需的内容,或者有什么我们可以让这份文档更清晰,请将其发布到 Boost 用户邮件列表。
继续前进
祝您好运,玩得开心!
—Boost 开发者
| [1] | 我们建议下载 boost_1_82_0.7z 并使用 7-Zip 来解压它。我们不再推荐 .zip 文件用于 Boost,因为它们的大小是相应 .7z 文件的两倍。我们不建议使用 Windows 内置的解压功能,因为对于大型压缩文件,它可能会非常慢。 |
| [2] | 使用预编译头文件使用 Boost 没有问题;这些说明只是避免使用预编译头文件,因为这会要求对示例中使用的源代码进行 Visual Studio 特定的更改。 |
| [3] | 在此示例中,脱字符^是一种将命令继续到多行的方式,并且必须是行上使用的**最后一个字符**才能继续(即,不要在其后加上空格)。命令提示符会响应更多?来提示输入更多内容。您可以随意省略脱字符和随后的换行符;我们使用它们是为了让示例能够适应合理的页面宽度。 命令提示符将命令中的每个空格视为参数分隔符。这意味着当单个命令行参数包含空格时,需要使用引号(")将文本保持在一起,例如 --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 库也会如此。 |