索引
获取 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
来安装到其他地方。另外,请考虑使用通过and--with-libraries=library-name-list 选项来限制如果你构建所有内容时会经历的漫长等待。最后,
$ ./b2 install
会将 Boost 二进制文件放在你的安装前缀的lib/子目录中。你还会在安装前缀的include/子目录中找到一份 Boost 头文件副本,因此你可以从此以后使用该目录作为#include路径,来代替 Boost 根目录。
如果你使用的编译器不是你的系统的默认编译器,你将需要使用 Boost.Build 来创建二进制文件。
如果你需要非标准的构建变体,你也将使用此方法(有关更多详细信息,请参阅 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 命令行选项注入 | 只有非常近的版本已知能很好地与 Boost 一起工作。请注意,Oracle/Sun 编译器有大量的选项会影响二进制兼容性:库的构建必须使用与你的应用程序将使用的相同的选项。特别要注意的是,默认的标准库可能与 Boost 工作不佳,*除非你正在为 C++11 构建*。你需要的特定编译器选项可以通过 b2 命令行选项注入:。例如,要使用 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 会创建一个子目录用于此目的。将当前目录更改为 Boost 根目录,然后调用
如下b2有关这些和其他调用选项的完整描述,请参阅Boost.Build 文档。
b2 --build-dir=build-directory toolset=toolset-name `` `` stage
例如,您的会话可能如下所示:3
例如,你的会话可能看起来像这样:
$ cd ~/boost_1_82_0 $ b2 --build-dir=/tmp/build-boost toolset=gcc stage
这将构建库的静态和共享的非调试多线程变体。要构建所有变体,请传递附加选项“--build-type=complete”。
目标会将 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 库时出现其他错误则需要引起关注。
如果你在构建 Boost 时看到任何错误消息,应该都与 IOStreams 库对 zip 和 bzip2 格式的支持有关,具体描述 在此。如果你需要这些功能,请安装 libz 和 libbz2 的相关开发包。构建 Boost 库时的其他错误是值得关注的。
user-config.jam文件,如此处所述。如果这不是您的问题,或者该文件对您不起作用,请将关于为您的编译器配置 Boost 的问题提交给Boost 用户邮件列表。文件,如此处所述。如果这不是您的问题,或者该为了演示链接到一个 Boost 二进制库,我们将使用以下简单的程序,该程序从电子邮件中提取主题行。它使用了Boost.Regex 库,该库有一个单独编译的二进制组件。
为了演示如何链接到 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 构建设置。
链接到库主要有两种方法:
你可以指定每个库的完整路径。
$ c++ -I path/to/boost_1_82_0 example.cpp -o example \ ~/boost/stage/lib/libboost_regex-gcc34-mt-d-1_36.a
你可以单独指定一个目录进行搜索(使用-Ldirectory)和一个要搜索的库名称(使用-llibrary),2 忽略文件名开头的--stagedir=和结尾的后缀(.so在这种情况下)
$ c++ -I path/to/boost_1_82_0 example.cpp -o example \ -L~/boost/stage/lib/ -lboost_regex-gcc34-mt-d-1_36
正如你所见,对于一个库来说,这种方法和方法 A 一样简洁;当你使用同一目录下的多个库时,它*真正*会发挥作用。但是请注意,如果使用此方法处理同时具有静态(.so)和动态(,分别用于静态库(存档)和共享库。在 Windows 上,)构建的库,系统可能会为你自动选择一个,除非你在命令行中传递一个特殊选项,例如-static。
在上面的两种情况下,粗体文本是你需要添加到我们之前探索过的*命令行的*部分。
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 构建调试版本的代码。5 使用 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.
如果你链接到一个共享库,你可能需要准备一些特定于平台的设置,以便系统在运行你的程序时能够找到并加载它。大多数平台都有一个环境变量,你可以将包含库的目录添加到其中。在许多平台(Linux、FreeBSD)上,该变量是LD_LIBRARY_PATH,但在 MacOS 上是DYLD_LIBRARY_PATH,而在 Cygwin 上它只是PATH。在除cshandtcsh之外的大多数 shell 中,你可以按如下方式调整变量(同样,不要输入$—它代表 shell 提示符)
$ VARIABLE_NAME=path/to/lib/directory:${VARIABLE_NAME} $ export VARIABLE_NAME
在cshandtcsh上,它是
$ setenv VARIABLE_NAME path/to/lib/directory:${VARIABLE_NAME}
一旦设置了必要的变量(如果需要),你就可以按如下方式运行你的程序:
$ path/to/compiled/example < path/to/jayne.txt
程序应响应电子邮件主题:“Will Success Spoil Rock Hunter?”
这标志着你对 Boost 和将其集成到你的程序中的介绍的结束。当你开始认真使用 Boost 时,肯定会有一些你想让我们涵盖的附加要点。有一天我们可能会有一个“入门系列第二册”来处理它们。在此之前,我们建议你查阅以下资源。如果你找不到需要的东西,或者有什么我们可以让这份文档更清晰的,请将其发布到 Boost 用户邮件列表。
继续前进
祝您好运,玩得开心!
—Boost 开发者
[1] | 如果 Boost 包的开发者希望与我们合作,以确保这些说明可以与他们的包一起使用,我们很乐意提供帮助。请将你的兴趣告知 Boost 开发者列表。 |
[2] | 该选项是一个连字符后跟一个小写“L”字符,在某些字体中看起来非常像数字 1。 |
[3] | 请记住,警告是针对每个编译器实现的。特定 Boost 库的开发者可能无法访问你的编译器。此外,有些警告在通用代码中极难消除,以至于不值得费力。最后,有些编译器没有任何源代码机制来抑制警告。 |
[4] | 此约定区分了 Boost 库的静态版本与具有相同配置的 Boost DLL 的导入库,否则它们将具有相同的名称。 |
[5] | 这些库在没有优化或内联的情况下编译,启用了完整的调试符号,并且没有NDEBUG #defined。尽管有时这些选择确实不会影响与其他编译代码的二进制兼容性,但您不能指望 Boost 库也会如此。 |