Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73218
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-11 17:52
个人简介

黑夜给了我黑色的眼睛我却用它来寻找光明。

文章分类

全部博文(21)

文章存档

2015年(21)

我的朋友

分类: C/C++

2015-03-07 15:07:05


在C中嵌入Perl解释器,有必要查看perl的相关文档:

perldoc perlembed

 

编译嵌入的Perl代码的C代码文件,需要用到libperl.so这个链接库。但是gcc的-lperl参数的调用默认库路径下的该文件即/usr/lib64/libperl.so,而这个安装包在centOS6.5系统上的安装路径是/usr/lib64/perl5/CORE/libperl.so,

如果不做软连接,可以编译通过,但是不能执行:

yum -y install perl-libs

ln -s /usr/lib64/perl5/CORE/libperl.so /usr/lib64/libperl.so

 

 

在编写嵌入代码前,需要知道几个perl相关的头文件路径:

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

通常是/usr/lib64/perl5/CORE,然后开始编码:

vim C_Embed_Perl.c

#include               

#include                

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);

    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;

    perl_parse(my_perl,NULL,argc,argv,(char **)NULL);

    perl_run(my_perl);

    perl_destruct(my_perl);

    perl_free(my_perl);

    PERL_SYS_TERM();

    printf("11111111111\n");

}

上面代码的效果是,把main函数的参数(通常是perl脚本名)传递给PERL_SYS_INIT3函数,然后便由perl解释器处理。

 

编译嵌入了perl代码的C程序,不能简单编译,必须指定如下参数:

gcc -I/usr/lib64/perl5/CORE -lperl C_Embed_Perl.c

 

也可以参考官方的编译参数:

gcc -O2 -Dbool=char -DHAS_BOOL \

-I/usr/include \

-I/usr/lib64/perl5/CORE \

-L/usr/lib64/perl5/CORE \

-lperl -lm Perl_Embed_C.c

其中-lperl表示调用libperl.so。

 

执行结果:

./a.out my_perl.pl

 

效果是先执行my_perl.pl再执行后面printf语句 。

这种嵌入方式和使用system函数调用的区别在于:嵌入能更好的交互,比如传递变量,处理结果等,system是新建一个进程专门执行这段perl脚本,exec函数是新建一个进程并且替换当前进程。

阅读(2407) | 评论(0) | 转发(0) |
0

上一篇:Makefile语法规则

下一篇:objdump用法

给主人留下些什么吧!~~