索引
获取 Boost 副本最可靠的方法是从 SourceForge 下载发行版
在您想要放置 Boost 安装的目录中,执行
tar --bzip2 -xf /path/to/boost_1_82_0.tar.bz2
其他软件包
RedHat、Debian 和其他发行版打包者提供 Boost 库软件包,但是如果您使用第三方软件包,您可能需要调整这些说明,因为它们的创建者通常选择将 Boost 分解为多个软件包,重新组织 Boost 发行版的目录结构,和/或重命名库二进制文件。1 如果您有任何问题,我们建议使用来自 SourceForge 的官方 Boost 发行版。
这是结果目录结构的草图
boost_1_82_0/ .................The “boost root directory” index.htm .........A copy of www.boost.org starts here boost/ .........................All Boost Header files `` `` 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 根目录的路径(通常是/usr/local/boost_1_82_0)有时在文档和邮件列表中被称为$BOOST_ROOT。
要在 Boost 中编译任何内容,您需要在您的boost/路径中包含#include子目录。 `` ``
由于所有 Boost 的头文件都具有.hpp扩展名,并且位于 boost 根目录的boost/子目录中,因此您的 Boost#include指令将如下所示
#include <boost/whatever.hpp>
或
#include "boost/whatever.hpp"
这取决于您对使用尖括号包含的偏好。 `` ``
不要被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.
的文件中。现在,在您保存example.cpp的目录中,发出以下命令
c++ -I path/to/boost_1_82_0 example.cpp -o example
要测试结果,请输入
echo 1 2 3 | ./example
如果您想使用任何单独编译的 Boost 库,您需要获取库二进制文件。
在 shell 中发出以下命令(不要输入$;它代表 shell 的提示符)
$ cd path/to/boost_1_82_0 $ ./bootstrap.sh --help
选择您的配置选项并调用./bootstrap.sh再次,不带--help选项。除非您在系统的/usr/local/目录中具有写入权限,否则您可能至少需要使用
$ ./bootstrap.sh --prefix=path/to/installation/prefix
来安装到其他位置。另外,请考虑使用--show-libraries和--with-libraries=库名称列表 选项来限制您构建所有内容时将经历的漫长等待。最后,
$ ./b2 install
会将 Boost 二进制文件留在安装前缀的lib/子目录中。您还将在安装前缀的include/子目录中找到 Boost 头文件的副本,因此您以后可以使用该目录作为 Boost 根目录的#include路径。
如果您使用的编译器不是系统的默认编译器,则需要使用 Boost.Build 来创建二进制文件。
如果您需要非标准构建变体,您也将使用此方法(有关更多详细信息,请参阅 Boost.Build 文档)。
Boost.Build 是一个基于文本的系统,用于开发、测试和安装软件。首先,您需要构建并安装它。为此
首先,在下表中找到与您的编译器对应的工具集(最新列表始终可在 Boost.Build 文档中找到)。
注意
如果您之前为 构建 b2 的目的选择了工具集,您应该假设它不起作用,而是从下表中重新选择。
工具集名称 | 供应商 | 注释 |
---|---|---|
acc | Hewlett Packard | 只有非常新的版本已知可以与 Boost 良好配合使用 |
borland | Borland | |
como | Comeau Computing | 使用此工具集可能需要 配置 另一个工具集作为其后端。 |
darwin | Apple Computer | Apple 版本的 GCC 工具链,支持 Darwin 和 MacOS X 功能,如框架。 |
gcc | Gnu 项目 | 包括对 Cygwin 和 MinGW 编译器的支持。 |
hp_cxx | Hewlett Packard | 目标是 Tru64 操作系统。 |
intel | Intel | |
msvc | Microsoft | |
sun | Oracle | 只有非常新的版本已知可以与 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。 `` ``
Boost.Build 会将构建过程中生成的所有中间文件放入 构建目录。如果您的 Boost 根目录是可写的,则此步骤并非严格必要:默认情况下,Boost.Build 将在您当前的工作目录中创建一个bin.v2/子目录用于此目的。
将您的当前目录更改为 Boost 根目录并按如下方式调用b2如下
b2 --build-dir=build-directory toolset=toolset-name `` `` stage
有关这些和其他调用选项的完整描述,请参阅 Boost.Build 文档。
例如,您的会话可能如下所示
$ cd ~/boost_1_82_0 $ b2 --build-dir=/tmp/build-boost toolset=gcc stage
这将构建库的静态和共享非调试多线程变体。要构建所有变体,请传递附加选项“--build-type=complete”。
构建特殊的stage目标会将 Boost 库二进制文件放置在 Boost 树的stage/lib/子目录中。要使用不同的目录,请将--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; } }
与链接相关的两个主要挑战是
链接到库有两种主要方法
您可以指定每个库的完整路径
$ c++ -I path/to/boost_1_82_0 example.cpp -o example \ ~/boost/stage/lib/libboost_regex-gcc34-mt-d-1_36.a
您可以单独指定要搜索的目录(使用-L目录)和要搜索的库名称(使用-l库2,删除文件名的前导lib和尾随后缀(.a在本例中)
$ c++ -I path/to/boost_1_82_0 example.cpp -o example \ -L~/boost/stage/lib/ -lboost_regex-gcc34-mt-d-1_36
如您所见,对于一个库,此方法与方法 A 一样简洁;当您使用来自同一目录的多个库时,它真正发挥作用。但是,请注意,如果您将此方法用于同时具有静态(.a)和动态(.so)构建的库,系统可能会自动为您选择一个,除非您传递一个特殊选项,例如-static在命令行上。
在上述两种情况下,粗体文本是您将添加到 我们之前探讨的命令行 中的内容。
为了为您的构建配置选择正确的二进制文件,您需要了解 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 构建代码的调试版本。5 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.
如果您链接到共享库,您可能需要准备一些平台特定的设置,以便系统能够在程序运行时找到并加载它。大多数平台都有一个环境变量,您可以将包含库的目录添加到其中。在许多平台(Linux、FreeBSD)上,该变量是LD_LIBRARY_PATH,但在 MacOS 上是DYLD_LIBRARY_PATH,而在 Cygwin 上,它只是PATH。在除csh和和tcsh$之外的大多数 shell 中,您可以按如下方式调整变量(再次,不要输入
$ VARIABLE_NAME=path/to/lib/directory:${VARIABLE_NAME} $ export VARIABLE_NAME
—它代表 shell 提示符)csh和和在
$ setenv VARIABLE_NAME path/to/lib/directory:${VARIABLE_NAME}
上,它是
$ path/to/compiled/example < path/to/jayne.txt
设置必要的变量(如果有)后,您可以按如下方式运行您的程序
程序应该响应电子邮件主题,“Will Success Spoil Rock Hunter?”
所有 Boost 库文档的索引
前进
祝您好运,玩得开心!
[1] | —Boost 开发者 |
[2] | 如果 Boost 软件包的开发者希望与我们合作以确保这些说明可以与其软件包一起使用,我们很乐意提供帮助。请向 Boost 开发者列表 表明您的兴趣。 |
[3] | 该选项是一个破折号,后跟一个小写字母“L”字符,在某些字体中,它看起来很像数字 1。 |
[4] | 请记住,警告特定于每个编译器实现。给定 Boost 库的开发者可能无法访问您的编译器。此外,在通用代码中,某些警告非常难以消除,以至于不值得花费力气。最后,某些编译器没有任何源代码机制来抑制警告。 |
[5] | 此约定将 Boost 库的静态版本与配置相同的 Boost DLL 的导入库区分开来,否则它们的名称会相同。这些库在没有优化或内联的情况下编译,启用了完整的调试符号,并且没有 NDEBUG#define |