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工程属性对话框,设置如下:
1) Configure选择AllConfigurations;
2)General中OutputDirectory设置为.\lib,Intermediate Directory设置为.\obj\Debug|Release(需要在Debug和Release下分别设置);
3) C/C++中General下AdditionalInclude Directories设置./;./win32;
Advanced下设置DisableSpecific Warnings为4244;4996;4800;4805;4018。
在Preprocesssor下PreprocessorDefinitions添加COMPILER_MSVC(Debug和Release分别添加);
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 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行添加#undefmin。
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
解决方法:打开出现warning的文件,Ctrl+A全选,然后在文件菜单:file->advancedsave options ,在弹出的选项中选择新的编码方式为:UNICODE codepage 1200 ,点击确定
注意:VC生成静态库release版比debug版库文件尺寸更大的原因:得出的结论是,此问题是由VS的Build选项中Optimization项下的Whole Program Opeimization选项不同设置引起:Debug版的此选项缺省设成No,而Release版的此选项缺省设成Enablelink-time code generation (/GL)。由于静态库并不进行链接,而全局优化要等到链接时,所以release版产生的库文件就要比debug版的大上不少了。
RE2 Windows移植的源代码下载地址:http://code.google.com/p/re2/issues/detail?id=89。