索引
获取 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=library-name-list 选项来限制如果您构建所有内容,您将遇到的漫长等待时间。最后,
$ ./b2 install
将 Boost 二进制文件留在安装前缀的lib/子目录中。您还将在安装前缀的include/子目录中找到 Boost 头文件的副本,因此您可以从此处使用该目录作为#include路径来代替 Boost 根目录。
如果您使用的是系统默认编译器以外的编译器,则需要使用 Boost.Build 来创建二进制文件。
如果您需要非标准构建变体,您也需要使用此方法(有关更多详细信息,请参阅 Boost.Build 文档)。
Boost.Build 是一个基于文本的系统,用于开发、测试和安装软件。首先,您需要构建并安装它。为此
首先,在下表中找到与您的编译器对应的工具集(最新的列表始终可在 Boost.Build 文档 中找到)。
注意
如果您之前为了 构建 b2 而选择了一个工具集,则应假设它无法工作,而应从下表中重新选择。
工具集名称 | 厂商 | 注释 |
---|---|---|
acc | 惠普 | 仅已知最新版本与 Boost 配合良好 |
borland | Borland | |
como | Comeau Computing | 使用此工具集可能需要 配置另一个工具集作为其后端。 |
darwin | 苹果电脑 | 苹果版本的 GCC 工具链,支持 Darwin 和 MacOS X 功能,例如框架。 |
gcc | GNU 项目 | 包括对 Cygwin 和 MinGW 编译器的支持。 |
hp_cxx | 惠普 | 针对 Tru64 操作系统。 |
intel | 英特尔 | |
msvc | 微软 | |
sun | 甲骨文 | 仅最新版本才能与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 将在其构建过程中生成的所有中间文件都放置到 **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”。
构建特殊的阶段目标会将Boost库二进制文件放置在阶段/lib/Boost树的子目录中。要使用不同的目录,请传递--stagedir=目录选项到b2.
注意
b2区分大小写;务必使上面以 **粗体** 显示的所有部分都完全小写。
有关调用时可以传递的其他选项的说明,请键入b2。
b2 --help
特别是,为了限制构建所花费的时间,您可能需要关注
注意
Boost.Build可以产生大量输出,这使得很容易错过问题。如果您想确保一切顺利,您可以通过附加“>build.log 2>&1”到您的命令行中来将输出重定向到一个文件中。
在构建Boost库的过程中,您可以预期会在控制台上看到一些打印的消息。这些可能包括:
有关Boost库配置的通知——例如,如果在没有Unicode支持的情况下构建Regex库,它会输出关于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。在大多数shell(除了csh和tcsh之外),您可以按如下方式调整变量(同样,不要键入$——它代表shell提示符)
$ VARIABLE_NAME=path/to/lib/directory:${VARIABLE_NAME} $ export VARIABLE_NAME
在csh和tcsh上,它是
$ setenv VARIABLE_NAME path/to/lib/directory:${VARIABLE_NAME}
设置必要的变量(如果有)后,您可以按如下方式运行程序:
$ path/to/compiled/example < path/to/jayne.txt
程序应回复邮件主题:“成功会毁掉摇滚猎手吗?”
以上就是Boost入门以及将其集成到您的程序中的介绍。当您开始认真使用Boost时,肯定还有一些额外的点希望我们能涵盖到。也许有一天我们会出一本“入门系列第二卷”来解答这些问题。在此之前,我们建议您参考以下资源。如果您找不到需要的内容,或者有任何可以使本文件更清晰的地方,请将其发布到Boost用户邮件列表。
继续前进
祝你好运,玩得开心!
——Boost 开发者团队
[1] | 如果Boost软件包的开发者希望与我们合作,以确保这些说明可以与他们的软件包一起使用,我们将非常乐意提供帮助。请将您的意向告知Boost开发者列表。 |
[2] | 该选项是一个短横线后跟一个小写“L”字符,在某些字体中看起来非常像数字1。 |
[3] | 请记住,警告是特定于每个编译器实现的。给定Boost库的开发者可能无法访问您的编译器。此外,一些警告很难在通用代码中消除,以至于不值得费力。最后,有些编译器没有任何源代码机制来抑制警告。 |
[4] | 此约定将Boost库的静态版本与其具有相同名称的相同配置的Boost DLL的导入库区分开来。 |
[5] | 这些库是在没有优化或内联的情况下编译的,启用了完整的调试符号,并且没有NDEBUG #defined。虽然有时这些选择不会影响与其他已编译代码的二进制兼容性,但您不能依赖于Boost库。 |