索引
获取 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 将每个数字乘以 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.
现在,在您保存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 将在其构建过程中生成的所有中间文件都放置到**构建目录**中。如果您的 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 库二进制文件放置到stage/库/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 删除文件名开头的库和结尾的后缀(.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 中,您可以按如下方式调整变量(同样,不要键入$—它表示 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
程序应以电子邮件主题“Will Success Spoil Rock Hunter?”进行响应。
这结束了您对 Boost 及其与程序集成的介绍。当您开始认真使用 Boost 时,您肯定希望我们能介绍一些其他要点。有一天,我们可能会有一本“入门系列第 2 版”来解决这些问题。在此之前,我们建议您参考以下资源。如果您找不到所需内容,或者有任何我们可以做的事情使本文档更清晰,请将其发布到Boost 用户邮件列表。
继续前进
祝您好运,玩得开心!
—Boost 开发人员
[1] | 如果 Boost 包的开发人员希望与我们合作,以确保这些说明可以与他们的包一起使用,我们将很乐意提供帮助。请将您的兴趣告知Boost 开发人员列表。 |
[2] | 该选项是连字符后跟小写字母“L”,在某些字体中看起来非常像数字 1。 |
[3] | 请记住,警告特定于每个编译器实现。给定 Boost 库的开发人员可能无法访问您的编译器。此外,某些警告在通用代码中非常难以消除,以至于不值得麻烦。最后,某些编译器没有任何用于抑制警告的源代码机制。 |
[4] | 此约定将 Boost 库的静态版本与配置相同的 Boost DLL 的导入库区分开来,否则它们的名称将相同。 |
[5] | 这些库是在没有优化或内联的情况下编译的,启用了完整的调试符号,并且没有NDEBUG #defined。虽然有时这些选择不会影响与其他已编译代码的二进制兼容性,但您不能依赖于 Boost 库的这种兼容性。 |