如果您计划从 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
然后按住 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 是一个用于开发、测试和安装软件的基于文本的系统。首先,您需要构建并安装它。要做到这一点
如果您先前为构建 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 命令行选项注入 | cxxflags=``和 ``linkflags=。例如,要使用 Apache 标准库以 C++03 模式构建,请使用b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4vacpp. |
IBM | VisualAge C++ 编译器。 | 如果您安装了同一编译器的多个版本,您可以将版本号附加到工具集名称后,前面加上连字符,例如 |
intel-9.0borland-5.4.3或。在 Windows 上,即使您只有一个编译器版本,也要附加版本号(除非您使用 msvc 或 gcc 工具集,它们有特殊的版本检测代码),否则自动链接将失败。Boost.Build 将在构建过程中生成的所有中间文件放置在构建目录中。如果您的 Boost 根目录是可写的,则此步骤不是必需的:默认情况下,Boost.Build 会在您的当前工作目录中创建一个
bin.v2/子目录用于此目的。将当前目录更改为 Boost 根目录,然后调用
如下b2有关这些和其他调用选项的完整描述,请参阅Boost.Build 文档。
b2 --build-dir=build-directory toolset=toolset-name --build-type=complete stage
例如,您的会话可能如下所示: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 库的二进制文件放置在 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 库时出现其他错误则需要引起关注。
如果构建系统似乎找不到您的编译器和/或链接器,请考虑设置一个
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; } }
工具配置,例如选择命令行选项或 IDE 构建设置。
大多数 Windows 编译器和链接器具有所谓的“自动链接支持”,这消除了第二个挑战。Boost 头文件中的特殊代码会检测您的编译器选项,并利用这些信息将正确的库名称编码到您的目标文件中;链接器会从您告知它搜索的目录中选择具有该名称的库。
GCC 工具链(Cygwin 和 MinGW)是一个显著的例外;GCC 用户应参考Unix 变体 OS 的链接说明以获取适用的命令行选项。
从我们之前创建的仅标头文件的示例项目开始
在配置属性 > 链接器 > 其他库目录中,输入 Boost 二进制文件的路径,例如
\libC:\Program Files\boost\boost_1_82_0。如果您像 Visual C++ 一样,您的编译器支持自动链接,您可能可以跳到下一步。:
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可以分解为以下元素前缀:在 Microsoft Windows 上,所有 Boost 库名都以这个字符串开头。在 Windows 上,只有普通静态库使用
当使用以下情况时使用此库
键 Boost.Build 选项 静态链接到 C++ 标准库和编译器运行时支持库。 s runtime-link=static g 使用标准和运行时支持库的调试版本。 runtime-debugging=on 使用特殊的Python 调试构建。 y python-debugging=on 构建您代码的调试版本。6 d variant=debug 使用 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 库也会如此。 |