boost是一套开放源代码的,高度可移植的C++库。它相当于C++标准库(STL)的改进与扩展。并且,它其中的不少模块,已被下一代C++标准库采用。的确,boost库非常注重与C++标准库之间协同性,用户对STL的许多学习或使用的体验,在接触boost时,会很自然地“似曾相识”。
定位上,boost 库希望自己是一个可用于广泛的、不同业务方向的应用都能使用的基础库——这完全和STL的定义一致,但STL太过于基础了,我们来做一个比较吧。
首先,boost是一个基础库。boost不像wxWidgets那样具备一个明确的业务方向:GUI(虽然wxWidgets也提供了众多其它功能)。boost提供的功能偏向基础设施,所以它的应用目标更为广泛。
然后,boost和STL比较,STL作为C++必须实现的标准库,它几乎就是在提供成型的,可复用的“数据结构”与“算法”的大全。boost,特别是2008年发布的1.36版,提供了大量高级功能。当前包括:“正则表达式”、“线程”、“网络”、“数学”、“图(数学)”、“字符串”、“CRC校验”、“文件”、“日期、时间”、“图(图形处理)”等等模块。
如果在不同语言之间做横向比较,那么我们会发现,Java和C# (.NET)语言,它们的标准库所提供的功能无比广泛,而C++的标准库则相当可怜——甚至连“线程”都没有提供。boost库非常好地弥补了C++的这一点不足。
和STL类似,boost大量采用现代C++的泛型编程技术。因此多数模块,我们在使用时,仅仅需要引用其“头文件”;另外有10来个必须或者建议进行编译的模块——但本书下面的教程并没有对这10来个库进行完整编译——至少有两个原因:其一、我们并不立即就用到全部的boost库;其二、如果完整编译,需要使用的时间,可能长达5个小时。
2.5.1. 准备
本书光盘自带了安装boost所需要的两个文件,您也可以上boost官方网站(参看本小节尾部的相关网址),下载这两个文件:
下载后,得到源代码压缩文件,如果是7zip格式的“boost_1_36_0.7z”,约25M,解压后,将迅速变为175M,但这仅仅是源代码及文档的大小,在编译过程中,所需的空间更是惊人,请您保证解压缩后文件所在的磁盘驱动器,至少有5个G的可用空间。
boost 的编译工具,可以根据需要,将编译之后库文件,及不需要编译的头文件,统一复制到指定的目录,这样有利于我们得到一个“干净”的boost编译结果目录,本书将采用此方法。
下面,我们假设boost_1_36_0.7z被解压到“X:\tmp\boost_1_36_0”目录下,其中“X:”表示您选用的磁盘驱动器盘符, “tmp”是我们事先创建的文件夹,而 “boost_1_36_0”则在解压以后得到。我们把“X:\tmp\ boost_1_36_0”称为“boost安装源路径”。
接下来,假设我们希望它boost安装到“E:\ boost_1_36_0”目录下,请事先创建好这个文件夹,我们把这个路径,称为“boost安装目标路径”。
请解压“boost-jam-3.1.16-1-ntx86.zip”文件,得到bjam.exe,将它复制到boost安装源路径,即“X:\tmp\boost_1_36_0”之下。
2.5.2. 编译
步骤1:打开“开始”菜单,选择“运行”,输入cmd,进入控制台窗口,然后在其内通过cd命令,切换到boost安装源路径下。本例中为:
“X:\tmp\boost_1_36_0”,则过程如下:
X: (回车)
cd tmp\boost_1_36_0 (回车)
步骤2:继续上步,请在控制台内输入:
bjam --show-libraries (回车)
步骤3:正确情况下,将看到以下输出内容:
The following libraries require building:
- date_time
- filesystem
- function_types
- graph
- iostreams
- math
- mpi
- program
_options
- python
- regex
- serialization
- signals
- system
- test
- thread
- wave
步骤4:这里列出的是所有需要编译的boost模块,但我们将放弃对以下模块的编译: wave、mpi、 python、math、graph。这些模块的具体含义,大家如有需要,请自行查明。
步骤5:继续上步,在控制台内输入:
bjam install --toolset=gcc --prefix="E:\boost_1_36_0" debug --without-wave --without-mpi --without-python --without-math --without-graph (回车)
步骤6:请特别注意其中加粗部分,更换为您自己的“boost安装目标路径”。其它部分作如下说明:
步骤7:-- 是两个连续的减号,=前后均不能夹带空格,除路径之外,参数都是小写字母。
步骤8:--toolset 表示采用gcc编译。这里指的mingw32下的gcc。因此,要正确编译boost,请您一定事先已完成2.1小节中,有关Code::Blocks下mingw32环境的安装。
步骤9:debug表示我们首先编译“调试版”。
步骤10:多个 --without 指定了所要放弃编译的模块。
步骤11:回车后,控制台内将出现大量看似奇奇怪怪地文字,最后能看到以下内容,就表示成功完成本步:
...failed updating 2 targets.
...skipped 31 targets...
...updated 341 targets...
步骤12:继续上步,在控制台内输入:
bjam install --toolset=gcc --prefix="E:\boost_1_36_0" release --without-wave --without-mpi --without-python --without-math --without-graph (回车)
步骤13:改变的是“debug”更换为“release”。回车后开始发行版的boost库编译。
2.5.3. 补充
如果您的硬盘还有很大的空闲,比如还有50G空间没用上呢,那么我们也不反对——应该说是非常地支持——事实上是非常地艳羡——您完整地编译boost。
〖危险〗:编译boost:时间与空间双重负担
没错,我们马上就要提供“boost完全编译”的方法,但先要郑重提醒您:完整编译boost,不仅需要接近5个小时的等待,而且在空间上,需要高达12~15G的磁盘空间。
完整编译boost的命令行:
bjam install --toolset=gcc --prefix="您的\boost\安装\目标路径" --build-type=complete
2.5.4. 结束
检查“boost安装目标路径”,应该可以看到两个子目录位于其内:“include”及“lib”,前者保存着所有采用纯头文件形式提供的boost代码文件;后者则保留着上一步的编译结果,这些库文件首先可以区分为以下三种形式:
然后三种形式再次区分为“发行版”和“调试版”,后者的文件名比前者多出一个“-d-”修饰。另外我们还可以看到所有库文件名中都带有“-mt-”字样,这是表示这些库都支持“多线程/Multithreads”。
请保存“boost_1_36_0.7z”及“boost-jam-3.1.16-1-ntx86.zip”两个文件,然后,建议您将 “boost安装源路径”下的doc文件夹——这是boost的说明文档——复制到“boost安装目标路径”下,然后,您可以放心地删除“boost安装源路径”。
2.5.5. 相关网址
官方网站:http://www.boost.org/