当前位置: 首页 > 工具软件 > RE2 > 使用案例 >

RE2正则表达式库的Windows移植

堵才哲
2023-12-01

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

 类似资料: