分类: 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函数是新建一个进程并且替换当前进程。