XSUB фактически не требуют наличия внешней библиотеки.Они просто предоставляют возможность вызова функции ac из пространства perl и обеспечивают некоторое удобство при отображении соглашений о вызовах между 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 такого рода действия обычно выполняются в функции xs_init, которую вы передаете parse_perl
.
EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
static void
xs_init (pTHX)
{
newXS("Some::Perl::function", XS_some_func, __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);
После этого выВы сможете вызывать XSUB как Some::Perl::function
из пространства perl, и этот XSUB, в свою очередь, может свободно перезванивать вашему приложению любым удобным для него способом.