Vista下使用Visual Studio 2008(VC)独立编译Boost.Regex库

Boost 1.39.0

大家只要知道这是什么就可以了,Boost中的正则表达式库!
貌似是现在解析正则表达式效率最高的库了,也许有人单独用Regex++,这其实就是Boost中的Regex库,只不过作者单独提供,不知道为什么(懒得探究了),这个库我没法编译,提示Makefile语法有错,未知。。。

正则表达式很适合处理和字符串有关的工作,比如匹配,验证,搜索等等。。。
不了解的朋友可以百度一下相关的资料。。。值得一学!^_^

好了,这里总结一下我的编译过程,互相交流。
因为现在只想使用Regex库(要支持Unicode),其他的Boost库暂时不用(全部编译花了我4.5G,还没编译完。。。),所以进行单独编译。

  1. 因为我主要使用Unicode编码的字符串。所以要Regex支持Unicode,这里需要ICU,从Sourceforge下载(http://nchc.dl.sourceforge.net/sourceforge/icu/icu4c-4_0-src.zip)(需要的话,还有帮助文档)

  2. 编译ICU,比较简单,解压,打开source\allinone子目录下的allinone.sln项目文件,附带的是VS2005的,这里需要升级到2008,一般没什么问题,然后直接编译,Debug或者Release的,看你需要了,之后在lib目录下能够找到库文件,bin目录下有dll文件(动态库编译)。

小提示:因为我之前使用STLPort替换MS的STL,所以第一次编译出了点问题,应该是设置的问题,没有深究,改成原来MS的STL,就可以了。

  1. 解压Boost

  2. 使用bjam。你可以自行编译bjam,我这里直接使用编译好的版本。(之前使用nmake编译,成功了,但是编译之后的库文件的命名为1.38.0的,可能是作者疏忽,如果自己改的话,麻烦,不如直接重新编译,使用bjam就没有这个问题)
    放到解压后的Boost文件夹中的libs\regex\build子文件夹,因为bjam要使用这里的Jamfile.v2文件单独编译Regex

  3. 打开cmd(如果后面编译失败,可以尝试使用管理员身份运行)

  4. 给命令行编译器设置环境变量,直接调用Visual Studio 2008目录中的配置文件,在Common7\Tools子目录中的vsvar32.bat
    我的是:E:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvar32.bat
    直接在cmd里粘贴"E:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvar32.bat”
    注意要包含双引号,因为我这里的路径有空格,如果你的也是,就要用双引号括起来

  5. 不停地cd进入到解压后的Boost文件夹中的libs\regex\build子目录,调用如下命令
    bjam –sICU_PATH=icupath threading=multi link=shared,static runtime-link=static
    因为我使用多线程,所以就编译线程安全的multi库,要编译单线程的,用single参数
    icupath是指icu的解压目录(不是ICU编译后的lib目录,lib目录bjam会自己定位),如果这里也包含空格,同样的,也要使用双引号括起来

  6. 等待一会,就会编译完成,在Boost的解压目录中的bin.v2\libs\regex\build\msvc-9.0子目录中就会找的编译好的文件,lib和dll等,而且分类存放了起来
    为了使用方便,我做了如下调整,将所有文件直接存放到bin.v2\libs\regex\build\msvc-9.0下自己新建的lib文件夹里,需要连接什么文件regex的头文件清楚,我们只需指定必要的宏就可以了

  7. 配置Visual Studio 2008。将刚才自己创建的lib子目录添加进VS的库文件的搜索路径,然后将解压后的Boost路径添加进VS的包含文件的搜索路径,即可

  8. 开一个win32的小项目regextest测试一下,代码如下:

#include "stdafx.h"
#include <iostream>
#include <boost/regex.hpp>

int _tmain(int argc, _TCHAR* argv[])
{
     boost::wregex a(L"\\d{4}");
     if(boost::regex_match(L"1325",a))
     {
         std::cout<<"yes"<<std::endl;
     }
     else
     {
         std::cout<<"no"<<std::endl;
     }

     return 0;
}

编译连接通过,测试结果:yes

有什么问题的话,我们互相交流^_^

标签: none

添加新评论