在C/C++程序中嵌入perl解释器---注意事项

最近打算在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 perlembed

就可以看到文档的内容。可是有的人却是通过搜索引擎找到了文档的在线版本。这也不错,但是要命的是好多人并不看版本号,结果对着旧版本的文档做,程序运行时就很容易出问题。使用perldoc命令进行的显示类似于unix的man,查阅起来很不方便,因此我都是通过下面的命令生成一个网页版的文档。

perldoc  -d embeding.html  -o html perlembed

问题2:为什么无法生成perlxsi.c文件

下面这个命令的作用是生成perlxsi.c文件

perl -MExtUtils::Embed  -e xsinit

不过我在敲入这个命令多次之后,都没有产生perlxsi.c,如果你碰到和我一样的情况,那么可以看看下面这样是否会在终端输出perlxsi.c的代码。

perl -MExtUtils::Embed  -e xsinit  --  -o STDOUT

如果这个命令能够产生输出,那么就将输出文件明确的指定为perlxsi.c,类似这样:

perl -MExtUtils::Embed  -e xsinit  --  -o perlxsi.c

这样就会在当前目录下生成perlxsi.c文件。

问题3:如何设置lib和include的目录

这个问题很简单,首先你得知道perl的安装目录,如果你不知道,那么可以这样查看:

perl  -MConfig  -e  "print $Config{archlib}"

输入这个命令后,终端会显示出perl lib文件夹的路径,而我们的include目录和lib目录都是perl lib文件夹下一个名叫CORE的子文件夹。上述文件夹可以在Visual Studio中进行设置,不过我更喜欢用一个makefile来编译程序,在makefile中做这样的设置十分简单,比如我的一个makefile就是下面这个样子。

CFLAGS =  /nologo  //EHsc  /Zi  /I "E:\perl\lib\CORE"
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<iostream>
#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值