最近打算在C++中使用正则表达式,本打算使用c++11的正则表达式库,不过,发现转义字符写起来太蛋疼了。于是乎决定用perl作为脚本,然后c++调用perl中的正则表达式。查了下文档,百度发现一篇不错的文章,收藏下来。感谢作者,提供这份注意事项,写的挺详细的。
在C/C++程序中嵌入perl解释器
版权所有, 转载请注明:http://www.hailongchang.org
早就听说,在C/C++程序中嵌入一个perl解释器是得到perl社区官方支持的,整个过程很简单。简单了解之后,发现还是有一些地方值得新手注意。
我所测试的环境是Windown7 / Visual Studio 2008 / ActivePerl 5.10.1
先大致说一下步骤吧, 首先生成perlxsi.c,这个文件的作用就是完成一些初始化的工作。然后是正确设置include文件夹和lib文件夹的路径,接下来就是将perlxsi.c和你自己的程序文件编译链接到一起,形成一个嵌入了perl解释器的可执行文件。下面则是几个我在实践上述步骤中碰到的困难以及对应的解决办法。
问题1:从哪里得到文档支持
在C/C++中嵌入解释器,文档的perlembed部分有十分详细的描述,在终端下输入:
就可以看到文档的内容。可是有的人却是通过搜索引擎找到了文档的在线版本。这也不错,但是要命的是好多人并不看版本号,结果对着旧版本的文档做,程序运行时就很容易出问题。使用perldoc命令进行的显示类似于unix的man,查阅起来很不方便,因此我都是通过下面的命令生成一个网页版的文档。
问题2:为什么无法生成perlxsi.c文件
下面这个命令的作用是生成perlxsi.c文件
不过我在敲入这个命令多次之后,都没有产生perlxsi.c,如果你碰到和我一样的情况,那么可以看看下面这样是否会在终端输出perlxsi.c的代码。
如果这个命令能够产生输出,那么就将输出文件明确的指定为perlxsi.c,类似这样:
这样就会在当前目录下生成perlxsi.c文件。
问题3:如何设置lib和include的目录
这个问题很简单,首先你得知道perl的安装目录,如果你不知道,那么可以这样查看:
输入这个命令后,终端会显示出perl lib文件夹的路径,而我们的include目录和lib目录都是perl lib文件夹下一个名叫CORE的子文件夹。上述文件夹可以在Visual Studio中进行设置,不过我更喜欢用一个makefile来编译程序,在makefile中做这样的设置十分简单,比如我的一个makefile就是下面这个样子。
LIBPATH = /LIBPATH : "E:\perl\lib\CORE"
All : test .exe
test .exe : test .obj perlxsi .obj
link /nologo $ ( LIBPATH ) test .obj perlxsi .obj perl510 .lib
test .obj : test .cpp
cl $ ( CFLAGS ) test .cpp
perlxsi .obj : perlxsi .c
cl $ ( CFLAGS ) perlxsi .c
clean :
del *.obj
del *.exe
其中test.cpp是我写的测试程序的名称。CFLAGS和LIBPATH都是makefile文件的变量,用来指定一些编译,链接的参数,/I参数指定要包含的include文件夹,/LIBPATH:指定lib文件的位置。在链接的最后要加入perl.lib这个静态库,我们可以看到,它是跟着一个版本号的,请在使用时查看你机器上这个静态链接库的名称。
问题4:编译时有大量的错误怎么办?
写好了makefile,将文档中的代码粘贴到源代码文件中,运行nmake,会发现编译器提示有大量的错误。这种问题,很多时候是缺少windows.h这个文件的,因此要将这个头文件包含进去,对于perlxsi.c也需要这样做才能消除编译错误。此外有的人发现无法使用C++的标准库,其实这也是头文件包含的位置不对,应该将标准库的头文件也放到EXTERN.h的前面,下面是我更改后的一个源程序。
#include<windows.h>
#include<EXTERN.h>
#include<perl.h>
using std :: cout ;
using std :: endl ;
static PerlInterpreter *my_perl ;
int main ( int argc, char **argv, char ** env )
{
PERL_SYS_INIT3 ( &argc, &argv, &env ) ;
my_perl = perl_alloc ( ) ;
perl_construct (my_perl ) ;
perl_parse (my_perl, NULL,argc,argv, NULL ) ;
perl_run (my_perl ) ;
perl_destruct (my_perl ) ;
perl_free (my_perl ) ;
cout << "bye-bye" << endl ;
PERL_SYS_TERM ( ) ;
return 0 ;
}
基本上解决掉上述问题,你所嵌入的perl解释器就能工作了,赶紧输入一些简单的perl语句测试一下吧!
链接:http://www.hailongchang.org/index.php/archives/365