如果您计划从 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\boost 子目录的目录在您的#includeinclude 路径中。 在本文档的后面部分将介绍在 Microsoft Visual Studio 中设置#include路径的具体步骤;如果您使用其他 IDE,请查阅您产品的文档以获取说明。
由于所有 Boost 的头文件都具有.hpp扩展名,并且位于 boost 根目录的boost\boost 子目录中,因此您的 Boost#include#include 指令将如下所示
#include <boost/whatever.hpp>
#include <boost/whatever.hpp>
#include "boost/whatever.hpp"
或#include#include "boost/whatever.hpp"
取决于您对使用尖括号包含的偏好。即使 Windows 用户也可以(并且,出于可移植性原因,可能应该)在#include 指令中使用正斜杠;您的编译器并不在意。\不要被doc\子目录分散注意力;它只包含 Boost 文档的子集。如果您正在寻找完整的内容,请从libs
index.html
开始。
许多人首先想知道的是,“我如何构建 Boost?” 好消息是,通常情况下,没有什么需要构建的。
无需构建?
Boost.Timer
Boost.Exception 为 32 位 _MSC_VER==1310 和 _MSC_VER==1400 提供了 exception_ptr 的非侵入式实现,这需要单独编译的二进制文件。 这通过 #define BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR 启用。
#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) << " " ); }
Boost.System 自 Boost 1.69 以来是仅头文件的。为了兼容性,仍然构建了一个存根库,但不再需要链接到它。为了保持简单,让我们从使用仅头文件库开始。以下程序从标准输入读取一系列整数,使用 Boost.Lambda 将每个数字乘以三,然后将它们写入标准输出.
将此程序的文本复制到一个名为
example.cpp
cd directory-name
后跟 Return。例如,
cd C:\boost_1_82_0
可以通过在除最后一行之外的所有行的末尾键入插入符号 (^)
) 来跨多行继续长命令。此页面上的一些示例使用该技术来节省水平空间。
从 Visual Studio 的文件菜单中,选择新建 > 项目…
C:\Program Files\boost\boost_1_82_0
在出现的新建项目对话框的左侧窗格中,选择 Visual C++ > Win32。
在右侧窗格中,选择 Win32 控制台应用程序 (VS8.0) 或 Win32 控制台项目 (VS7.1)。为了保持简单,让我们从使用仅头文件库开始。以下程序从标准输入读取一系列整数,使用 Boost.Lambda 将每个数字乘以三,然后将它们写入标准输出在名称字段中,输入 “example”
在解决方案资源管理器窗格中右键单击 example,然后从出现的弹出菜单中选择属性
在配置属性 > C/C++ > 常规 > 附加包含目录中,输入 Boost 根目录的路径,例如
1 2 3
C:\boost_1_82_0
将 IDE 生成的
example.cpp
的内容替换为上面的示例代码。
从生成菜单中,选择生成解决方案。
要测试您的应用程序,请按 F5 键并在出现的窗口中键入以下内容,然后按 Return 键
cl /EHsc /I path\to\boost_1_82_0 path\to\example.cpp
1 2 3
echo 1 2 3 | example
然后按住 control 键并按 “Z”,然后按 Return 键。
跳到下一步
从您计算机的开始菜单中,如果您是 Visual Studio 2005 用户,请选择
bootstrap .\b2
所有程序 > 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 C++,或者来自其他供应商的编译器,您需要使用 Boost.Build 来创建您自己的二进制文件。
将此程序的文本复制到一个名为
Boost.Build 是一个基于文本的系统,用于开发、测试和安装软件。首先,您需要构建并安装它。为此,请执行以下操作
转到目录 | tools | build |
---|---|---|
运行 | bootstrap.bat | b2 install --prefix= |
PREFIX,其中 PREFIX 是您希望 Boost.Build 安装到的目录 | 将 PREFIX | |
bin | 添加到您的 PATH 环境变量。 | 首先,在下表中找到与您的编译器对应的工具集(最新的列表始终可在 Boost.Build 文档中找到)。 |
如果您之前出于 构建 b2 的目的选择了工具集,您应该假设它不起作用,而是从下表中重新选择。 | 工具集名称 | 供应商 |
注释 | acc | Hewlett Packard |
只有非常新的版本已知与 Boost 配合良好 | bootstrap.bat | borland |
Borland | como | |
Comeau Computing | 使用此工具集可能需要 配置另一个工具集以充当其后端。 | |
darwin | Apple Computer | Apple 的 GCC 工具链版本,支持 Darwin 和 MacOS X 功能,例如框架。gccThe Gnu Project包括对 Cygwin 和 MinGW 编译器的支持。. |
hp_cxx | 目标是 Tru64 操作系统。 | intel |
Intelmsvc#include <boost/whatever.hpp>Microsoftsun
Oracle只有非常新的版本已知与 Boost 配合良好。请注意,Oracle/Sun 编译器有大量影响二进制兼容性的选项:至关重要的是,库的构建选项必须与您的应用程序将使用的选项相同。尤其要注意的是,默认的标准库可能无法与 Boost 配合良好,除非您正在为 C++11 构建。您需要的特定编译器选项可以使用 b2 命令行选项注入cxxflags=``和 linkflags=
。 例如,要在 C++03 模式下使用 Apache 标准库构建,请使用b2b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4
b2 --build-dir=build-directory toolset=toolset-name --build-type=complete stage
vacpp
IBM
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
VisualAge C++ 编译器。^, 如果您安装了特定编译器的多个版本,您可以将版本号附加到工具集名称,并在版本号前加上连字符,例如intel-9.0"borland-5.4.3
。 在 Windows 上,即使您只安装了一个版本,也请附加版本号(除非您正在使用 msvc 或 gcc 工具集,它们具有特殊的版本检测代码),否则 自动链接 将会失败。
Boost.Build 将在构建时生成的所有中间文件放入 构建目录 中。如果您的 Boost 根目录是可写的,则此步骤不是绝对必要的:默认情况下,Boost.Build 将在您当前的工作目录中创建一个bin.v2/子目录用于此目的。bin.v2/\将您的当前目录更改为 Boost 根目录并调用\b2如下所示b2 --build-type=complete stage installb2.
将此程序的文本复制到一个名为
b2有关这些和其他调用选项的完整说明,请参阅 Boost.Build 文档。
例如,您的会话可能如下所示:3b2C:\boost_1_82_0> b2 --build-type=complete stage install
b2 --help
...building libraries...
将此程序的文本复制到一个名为
--stagedir=directory 选项传递给b2。
请注意 b2 不区分大小写;重要的是,上面以 粗体 类型显示的所有部分都必须完全小写。
有关您在调用
b2 时可以传递的其他选项的说明,请键入
b2 --help
toolset-name.c++ long/path/to/file/being/built
特别是,为了限制构建所花费的时间,您可能对以下内容感兴趣
library-name 或
#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; } }
--without-
release
debug
添加到命令行来选择特定的构建变体。
Boost.Build 可以生成大量输出,这可能会使您很容易错过问题。如果您想确保一切顺利,您可以将输出重定向到一个文件中,方法是将 “
在构建 Boost 库的过程中,您可以预期会在控制台上看到一些消息。这些可能包括C:\Program Files\boost\boost_1_82_0关于 Boost 库配置的通知——例如,Regex 库在没有 Unicode 支持的情况下构建时会输出一条关于 ICU 的消息,如果您没有安装 Python,Python 库可能会被跳过而不会出错(但会发出通知)。:
cl /EHsc /I path\to\boost_1_82_0 example.cpp ^ /link /LIBPATH:C:\Program Files\boost\boost_1_82_0\lib
将此程序的文本复制到一个名为
来自构建工具的消息,报告已构建或跳过的目标数量。如果这些数字对您没有任何意义,请不要感到惊讶;每个库都有许多目标。
描述工具正在执行的操作的构建操作消息,看起来像compile C:\boost_1_82_0\libs\regex\src\c_regex_traits.cpp编译器警告。
自动链接
大多数 Windows 编译器和链接器都具有所谓的“自动链接支持”,这消除了第二个挑战。Boost 头文件中的特殊代码检测您的编译器选项,并使用该信息将正确库的名称编码到您的目标文件中;链接器从您告诉它搜索的目录中选择具有该名称的库。 GCC 工具链(Cygwin 和 MinGW)是值得注意的例外;GCC 用户应参考 Unix 变体操作系统链接说明,以了解要使用的适当命令行选项。 从我们之前创建的 仅头文件示例项目开始 在配置属性 > 链接器 > 附加库目录中,输入 Boost 二进制文件的路径,例如 C:\boost_1_82_0\lib\ 例如,我们可以通过简单地将下面的 粗体 文本添加到我们之前使用的命令行来从 Visual C++ 命令行编译和链接上面的程序,假设您的 Boost 二进制文件位于 C:\boost_1_82_0\lib cl /EHsc example.cpp /link /LIBPATH:C:\boost_1_82_0\lib 如果像 Visual C++ 一样,您的编译器支持自动链接,您可能可以 跳到下一步。 为了为您的构建配置选择正确的二进制文件,您需要知道 Boost 二进制文件是如何命名的。每个库文件名都由一系列通用元素组成,这些元素描述了它的构建方式。例如, libboost_regex-vc71-mt-d-x86-1_34.lib 可以分解为以下元素 前缀:除了 Microsoft Windows 之外,每个 Boost 库名称都以此字符串开头。在 Windows 上,只有普通的静态库使用 lib 前缀;导入库和 DLL 不使用。5 boost_regex 库名称:所有 boost 库文件名都以 boost_
开头-vc71工具集标签:标识用于构建二进制文件的 工具集 和版本。
线程标签:指示库是在启用多线程支持的情况下构建的。没有多线程支持构建的库可以通过缺少
大多数 Windows 编译器和链接器都具有所谓的“自动链接支持”,这消除了第二个挑战。Boost 头文件中的特殊代码检测您的编译器选项,并使用该信息将正确库的名称编码到您的目标文件中;链接器从您告诉它搜索的目录中选择具有该名称的库。 -mt 来识别。 从我们之前创建的 仅头文件示例项目开始 -d ABI 标签:编码影响库与其他编译代码互操作性的详细信息。对于每个此类功能,都会向标签添加一个字母 键 使用此库时 Boost.Build 选项 s 静态链接到 C++ 标准库和编译器运行时支持库。 runtime-link=static g 在配置属性 > 链接器 > 附加库目录中,输入 Boost 二进制文件的路径,例如 使用标准库和运行时支持库的调试版本。 runtime-debugging=on y 使用 Python 的特殊 调试构建。 python-debugging=on boost_regex d 构建代码的调试版本。6
variant=debug
大多数 Windows 编译器和链接器都具有所谓的“自动链接支持”,这消除了第二个挑战。Boost 头文件中的特殊代码检测您的编译器选项,并使用该信息将正确库的名称编码到您的目标文件中;链接器从您告诉它搜索的目录中选择具有该名称的库。 p 从我们之前创建的 仅头文件示例项目开始 32 使用 STLPort 标准库,而不是编译器提供的默认标准库。 stdlib=stlport 64 例如,如果您构建代码的调试版本以与静态运行时库和 STLPort 标准库的调试版本一起使用,则标签将为 -sgdp
iIA-64:
To: George Shmidlap From: Rita Marlowe Subject: Will Success Spoil Rock Hunter? --- See subject.
architecture=ia64
path\to\compiled\example < path\to\jayne.txt
s
Sparc
architecture=mips*
p
RS/6000 & PowerPC
[1] | architecture=power |
[2] | 字母后的两位数字编码地址模型,如下所示 |
[3] | 地址模型^32 位如果您安装了特定编译器的多个版本,您可以将版本号附加到工具集名称,并在版本号前加上连字符,例如address-model=32 64 位"address-model=64 --build-dir="C:\Documents_and_Settings\dave\build-boost" 版本标签:完整的 Boost 发布版本号,句点替换为下划线。例如,版本 1.31.1 将标记为 “-1_31_1”。=.lib --build-dir_=_"C:\Documents and Settings\dave\build-boost" |
[4] | 扩展名:根据操作系统的常用约定确定。在大多数类 Unix 平台上,扩展名为 |
[5] | .a |
[6] | 和.so 分别用于静态库(存档)和共享库。在 Windows 上,.dll |