最近写个东西要用到正则表达式,于是就想到了Boost库,由于以前没有用过这个库,所以今天为这事儿真是费了一番功夫。

一开始想到的是Boost,但是突然想起VC++ 2008的SP1不是已经带了tr1的实现吗,貌似直接用就行了。但是事与愿违,我这里装的是VC++ 2008 Express,虽然也能#include <regex>,但是写出来的程序只能编译不能链接。后来一查才知道微软的tr1实现是不支持Express的(虽然不支持却又把头文件放在那里诓人),莫非又要去别个VC完整版那里拷点东西出来不成?这应该是没必要的,因为从VC++ 2003开始Boost就可以很好的在VC下编译了,所以干脆不管那个啥tr1了,准备直接从Boost官方网站下载Boost再自己编译。

我下载的是最小的那个7z的包,解压缩到D:\Boost,然后就可以开始编译了。压缩包里面带有Boost的帮助文档,打开intex.html可以看到。在Getting Started一节里面有详细的自助编译教程。

Boost可以完整编译也可以针对单独的模块编译。网上很多人说完整编译一下要五六个小时,所以很多人都不推荐完整编译,而是用到什么再编译什么,比如可以这样子单独编译正则表达式库:
  1. 从开始菜单打开VC++的命令行工具,浏览到D:\Boost\libs\regex\build
  2. 输入nmake /f vc9.mak开始编译,几分钟内可以完成
  3. 输入nmake /f vc9.mak install把编译出来的lib和dll等安装到VC安装目录的lib目录下
  4. 输入nmake /f vc9.mak clean把临时文件删除
要在VC++工程里面,要#include "D:/Boost/boost/regex.hpp",然后才能使用正则表达式库(不需要在链接器手工指定链接到哪个lib)。

但是这里会出现Boost的一个小小的bug,它的版本虽然已经是1.39了,但是编译出来的东西却都还是xxx1_38.xx这样子,这会导致链接器找不到需要的lib。于是那些xxx1_38.xx的文件名都要把1_38改成1_39才行。改了之后程序就能正常的编译和链接了。彻底的解决办法是用文本编辑器打开vc9.mak,把所有的1_38字符串都替换为1_39,然后再nmake和install。

在单独编译了一个包之后,我很快就不满足这种一个一个编译的方式了,我打算尝试完整编译。试验的结果是,编译时间根本就不需要网上说的五六小时那么长,在我的一台E7200的机器上面,完整编译只花了不到一个小时。而如果只编译静态库的话,时间还要少一半多。所以这事儿没那么可怕。唯一的小问题是完整编译出来的东西居然占了接近3G的硬盘空间,还好用NTFS的压缩文件夹功能,可以压缩到不到1G,这样就不算大了。

完整编译的方法也很简单:
  1. 到Boost官方网站下载一个最新的bjam.exe,这是用来编译Boost的工具,把它放到D:\Boost目录
  2. 从开始菜单打开VC++的命令行工具,浏览到D:\Boost
  3. 输入bjam --without-python toolset=msvc --build-type=complete开始编译(--build-type也可以不要,这样只编译静态库,既省时间又省硬盘空间)
  4. 添加VC++的include目录到D:\Boost,添加lib目录到D:\Boost\stage\lib
这样就可以在VC++工程里面直接#include <boost/regex.hpp>这样使用正则表达式库了。完整编译出来的dll和lib等没有上面说的那个1_38命名问题,而且编译出来的所有文件都集中的放在了一起,所以完整编译显然是更科学的做法。

BTW,用Windows SDK的命令行工具也可以编译,如果没装VC的话。