如果您打算从 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#include指令将类似于
#include <boost/whatever.hpp>
或
#include "boost/whatever.hpp"
,具体取决于您对使用尖括号包含的偏好。即使 Windows 用户也可以(并且出于可移植性原因,可能应该)在#include指令中使用正斜杠;您的编译器并不关心这一点。
不要被doc\子目录分散注意力;它只包含 Boost 文档的一个子集。如果您正在寻找完整的文档,请从libs\index.html开始。
许多人首先想知道的是:“如何构建 Boost?”好消息是,通常不需要构建任何东西。
无需构建?
大多数 Boost 库是仅限头文件的:它们完全由包含模板和内联函数的头文件组成,并且在链接时不需要单独编译的库二进制文件或特殊处理。
唯一必须单独构建的 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,则应该可以比较容易地将这些说明调整到您的环境。
从 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
然后按住 Ctrl 键并按“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 是一个基于文本的系统,用于开发、测试和安装软件。首先,您需要构建并安装它。为此
首先,在以下表格中找到与您的编译器相对应的工具集(最新列表始终可在 Boost.Build 文档中找到)。
注意
如果您之前为 构建 b2 选择了工具集,则应假设它无法正常工作,而是从下表中重新选择。
工具集名称 | 供应商 | 说明 |
---|---|---|
acc | 惠普 | 仅知最新版本才能与 Boost 良好配合 |
borland | Borland | |
como | Comeau Computing | 使用此工具集可能需要 配置 另一个工具集充当其后端。 |
darwin | 苹果电脑 | Apple 的 GCC 工具链版本,支持 Darwin 和 MacOS X 功能,例如框架。 |
gcc | GNU 项目 | 包括对 Cygwin 和 MinGW 编译器的支持。 |
hp_cxx | 惠普 | 针对 Tru64 操作系统。 |
intel | 英特尔 | |
msvc | 微软 | |
sun | Oracle | 仅知最新版本才能与 Boost 良好配合。请注意,Oracle/Sun 编译器有许多会影响二进制兼容性的选项:库的构建必须使用与应用程序将使用的选项相同的选项。特别要注意默认的标准库可能与 Boost 不兼容,除非您是为 C++11 构建的。您需要的特定编译器选项可以通过 b2 命令行选项注入cxxflags=``and ``linkflags=. 例如,要使用 Apache 标准库在 C++03 模式下构建,请使用b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4. |
vacpp | IBM | VisualAge C++ 编译器。 |
如果您安装了多个版本的特定编译器,则可以在工具集名称后附加版本号,并在其前面加上连字符,例如intel-9.0或borland-5.4.3. 在 Windows 上,即使您只安装了一个版本,也要附加版本号(除非您使用的是 msvc 或 gcc 工具集,它们有特殊的版本检测代码),否则 自动链接 将失败。
Boost.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
请务必阅读 此说明,了解^, 更多?和引号(")在该行中的外观。
选项“--build-type=complete”会导致 Boost.Build 构建所有支持的库变体。有关如何仅构建特定变体的说明,请在 Boost 用户邮件列表 上提问。
构建特殊的stage目标将 Boost 库二进制文件放置在stage\lib\Boost 树的子目录中。要使用其他目录,请传递--stagedir=目录 选项到b2.
注意
b2区分大小写;重要的是,上面 **粗体** 显示的所有部分都必须完全是小写。
有关您可以传递给调用时的其他选项的说明,b2,类型
b2 --help
特别是,为了限制构建花费的时间,您可能希望
注意
Boost.Build 可以产生大量的输出,这会导致难以发现问题。如果您想确保一切顺利,您可以通过在命令行末尾追加“>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 库时的其他错误令人担忧。
如果看起来构建系统无法找到您的编译器和/或链接器,请考虑设置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 时,您一定会希望我们涵盖一些其他要点。将来有一天,我们可能会有一本“入门系列第二卷”来解决这些问题。在此之前,我们建议您参考以下资源。如果您找不到所需内容,或者有任何需要我们改进本文档的地方,请将其发布到 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 库的这种兼容性。 |