RE2正则表达式库的Windows移植

前端之家收集整理的这篇文章主要介绍了RE2正则表达式库的Windows移植前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

RE2库的Windows移植过程如下:

1.从http://code.google.com/p/re2/downloads/list下载最新RE2库(re2-20130802.tgz)。

2.解压到当前本地硬盘上,生成一个re目录;

3.打开VS 2008开发环境,在re目录中创建一个新的静态库工程,命名为re2;

4.从网上(http://www.sourceware.org/pthreads-win32/)下载pthread-win32库,在解压的re2目录下创建一个win32目录,把pthread-win32头文件放置该目录中,把pthreadVC2.lib和pthreadVC2.dll放入到lib目录中。

从网上http://code.google.com/p/msinttypes/下载msinttypes-r26.zip 把其中stdint.h解压到win32目录下。

5.在创建的re2工程中添加re2目录中re2和util下的全部的cc源代码

6.打开re2工程属性对话框,设置如下:

@H_403_18@@H_403_18@1) Configure选择AllConfigurations;

@H_403_18@@H_403_18@2)General中OutputDirectory设置为.\lib,Intermediate Directory设置为.\obj\Debug|Release(需要在Debug和Release下分别设置);

@H_403_18@@H_403_18@3) C/C++中General下AdditionalInclude Directories设置./;./win32;

@H_403_18@@H_403_18@Advanced下设置DisableSpecific Warnings为4244;4996;4800;4805;4018

@H_403_18@@H_403_18@在Preprocesssor下PreprocessorDefinitions添加COMPILER_MSVC(Debug和Release分别添加);

@H_403_18@@H_403_18@4)Librarian中General下Additional Dependencies添加pthreadVC2.lib,AdditionalLibrary Directories添加./lib,Debug模式下Output File设置为$(OutDir)\$(ProjectName)d.lib。

7.Debug下编译re2工程,修改编译错误的地方。

0)warningC4819: The file contains a character that cannot be represented in the currentcode page (936). Save the file in Unicode format to prevent data loss

打开\unicode_casefold.h头文件,点击File/Advanced SaveOptions,Encoding选择Unicode – Codepage 1200,点击“OK”。

1)fatalerror C1083: Cannot open include file: 'sys/time.h': No such file or directory

在win32目录下创建sys目录,在sys目录中创建一个空的time.h头文件

2)errorC2039: 'unordered_set' : is not a member of 'std'

打开util.h文件,52行修改为usingstd::tr1::unordered_set;

3)fatal error C1083: Cannot open include file: 'unistd.h': No suchfile or directory

在win32目录下创建unistd.h头文件,加入下面两行:

#include <io.h>

#define write _write

4)errorC3861: 'strtoll': identifier not found; 'strtoull': identifier not found;'strtof': identifier not found

打开re2.cc文件,在第21行下面添加下面几个宏定义:

#if defined(_MSC_VER)

#define strtoll _strtoi64

#define strtoull _strtoui64

#define strtof strtod

#endif

5)error C3861:'snprintf': identifier not found

打开prefilter_tree.cc文件,在14行下面添加下面宏定义:

#if defined(_MSC_VER)

#define snprintf _snprintf

#endif

6)\valgrind.cc(12): error C2143: Syntax error : missing ')' before '{'

打开valgrind.cc,在第12行添加下面几行:

#if defined(_MSC_VER)

return 0;

#else

return RUNNING_ON_VALGRIND;

#endif

7)\thread.cc(11): error C2679: binary '=' : no operator found which takes

打开thread.cc文件,直接注释掉pid_ = 0;因为pthread-win32的pthread_t是一个结构。

8)从工程中删除remove掉test.cc、pcre.cc、benchmark.cc和sparse_array_test.cc文件

9)stringprintf.cc(17) : error C3861: 'va_copy': identifier not found

打开stringprintf.cc文件,在第6行下添加下面几行:

#if defined(_MSC_VER)

#define@H_403_18@ va_copy(dest,src) (dest = src)

#endif

10)stringpiece.cc(11): error C2039: '_write' : is not a member of 'std

打开stringpiece.cc文件,在第9行添加#undefwrite。

11)打开re2.cc文件,把RE2::Init成员函数中entire_regexp_= Regexp::Parse(的参数pattern_修改为pattern(大约198行左右)。

12)打开stringpiece.h头文件,在第26行添加#undef@H_403_18@min@H_403_18@。@H_403_18@

13)编译成功,在lib目录下生成re2d.lib、re2.lib两个静态库。此外,re2库用到的头文件在re2/re2目录下,包括filtered_re2.h、re2.h、set.h、stringpiece.h和variadic_function.h。

注意:必须把上面头文件放置在re2目录下,比如:放置到include/re2下。

注意:warningC4819: The file contains a character that cannot be represented in the currentcode page (936). Save the file in Unicode format to prevent data loss

@H_403_18@解决方法:打开出现warning的文件,Ctrl+A全选,然后在文件菜单:file->advancedsave options ,在弹出的选项中选择新的编码方式为:UNICODE codepage 1200 ,点击确定

@H_403_18@@H_403_18@注意:VC生成静态库release版比debug版库文件尺寸更大的原因:得出的结论是,此问题是由VS的Build选项中Optimization项下的Whole Program Opeimization选项不同设置引起:Debug版的此选项缺省设成No,而Release版的此选项缺省设成Enablelink-time code generation (/GL)。由于静态库并不进行链接,而全局优化要等到链接时,所以release版产生的库文件就要比debug版的大上不少了。

@H_403_18@RE2 Windows移植的源代码下载地址:http://code.google.com/p/re2/issues/detail?id=89

猜你在找的正则表达式相关文章