在嵌入式C应用程序中调用Perl的C函数

前端之家收集整理的这篇文章主要介绍了在嵌入式C应用程序中调用Perl的C函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,这是一个非常有趣的问题,可能没有任何简单的方法可以做到这一点,但是我想把它抛出来,然后再决定修改Perl是我的基本答案.

所以我有一个C应用程序以嵌入式方式调用Perl脚本.这一切都很好,很花哨,它非常棒,我可以传递信息并获得信息.不过,现在我的下一次征服了我需要允许我的嵌入式脚本能够调用C应用程序中的某些功能.

这很重要,因为XSUB会要求它是一个外部库;但我不希望它是一个外部库,我希望它直接调用C函数.现在也许这可以通过XSUB完成,我刚刚读过,理解错了.

Application -(run)-> Perl

Application <-(function_x())- Perl

Application -(returnfunction_x)-> Perl

这不可能是外部库的原因是因为我依赖于仅在应用程序中创建/存储的数据.

解决方法

实际上,XSUB并不需要这样的外部库.它们仅提供从perl空间调用c函数的能力,并为C和Perl之间的调用约定映射提供了一些方便.

所有您需要做的是将您编译到嵌入应用程序中的XSUB注册到您嵌入的perl解释器.

#include "XSUB.h"

XS(XS_some_func);
XS(XS_some_func)
{
    dXSARGS;
    char *str_from_perl,*str_from_c;

    /* get SV*s from the stack usign ST(x) and friends,do stuff to them */
    str_from_perl = SvPV_nolen(ST(0));

    /* do your c thing calling back to your application,or whatever */
    str_from_c = some_c_func(str_from_perl);

    /* pack up the c retval into an sv again and return it on the stack */
    mXPUSHp(c_str);
    XSRETURN(1);
}

/* register the above XSUB with the perl interpreter after creating it */
newXS("Some::Perl::function",XS_some_func,__FILE__);

当嵌入perl时,这种事情通常在传递给parse_perl的xs_init函数中完成.

EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);

static void
xs_init (pTHX)
{
    newXS("Some::Perl::function",__FILE__);
    /* possibly also boot DynaLoader and friends. perlembed has more
     * details on this,and ExtUtils::Embed helps as well. */
    newXS("DynaLoader::boot_DynaLoader",boot_DynaLoader,file);
}

perl_parse(my_perl,xs_init,argc,my_argv,NULL);

之后,您可以从perl空间调用XSUB作为Some :: Perl ::函数,并且XSUB可以随意以任何方式调用回您的应用程序.

猜你在找的C&C++相关文章