第一期:
无法加载模块 Fcntl,动态加载在此 perl 中不可用。
根据佩伦贝德您需要将一些 XS 粘合代码插入到嵌入式解释器中emperl.c
:
#include <EXTERN.h> /* from the Perl distribution */
#include <perl.h> /* from the Perl distribution */
static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
EXTERN_C void xs_init (pTHX);
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, xs_init, argc, argv, (char **)NULL);
perl_run(my_perl);
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
exit(EXIT_SUCCESS);
}
注意perl_parse()
现在运行时带有一个指向xs_init
子例程作为第二个参数。这xs_init()
可以生成函数并编译成emperl
使用这些命令进行二进制:
PERL=build/native/prefix/bin/perl5.34.0
$PERL -MExtUtils::Embed -e xsinit -- -o perlxsi.c
cc -c perlxsi.c `$PERL -MExtUtils::Embed -e ccopts`
cc -c emperl.c `$PERL -MExtUtils::Embed -e ccopts`
cc -o emperl perlxsi.o emperl.o `$PERL -MExtUtils::Embed -e ldopts`
如果我现在像您一样测试嵌入式二进制文件,它似乎工作正常:
$ ./emperl -e 'print 123; use Fcntl; print 456;'
123456
第二期:
如何添加自定义简单*.pm
模块如TLUtils.pm
无需将模块文件解压到临时目录中?
根据INSTALL文档:
如果您解压任何其他扩展ext/
运行前的目录Configure
, then Configure
也将提供构建这些额外的扩展。
我用一个简单的 XS 模块尝试了这个Sort::Key像这样(这里我使用Configure
option -Uusedl
强迫perl
完全静态编译):
mkdir -p source build/native/perl
wget -nc https://www.cpan.org/src/5.0/perl-5.34.0.tar.gz -P source
tar -xf source/*.tar.gz --strip-components=1 --directory=build/native/perl
cd build/native/perl
cd ext
wget https://cpan.metacpan.org/authors/id/S/SA/SALVA/Sort-Key-1.33.tar.gz
mkdir -p Sort-Key
tar -xf Sort-Key-1.33.tar.gz --strip-components=1 --directory=Sort-Key
cd ..
sh ./Configure -sde -Dman1dir=none -Dman3dir=none -Dprefix=$PWD/../prefix -Uusedl
make
make install
然后嵌入这个perl
使用emperl.c
代码如前:
PERL=build/native/prefix/bin/perl5.34.0
$PERL -MExtUtils::Embed -e xsinit -- -o perlxsi.c
# Note: for some reason you need to comment out the two lines with
# Devel::PPPort from perlxsi.c in order to compile it..
perl -i -ne 'print if !/PPPort/' perlxsi.c
cc -c perlxsi.c `$PERL -MExtUtils::Embed -e ccopts`
cc -c emperl.c `$PERL -MExtUtils::Embed -e ccopts`
cc -o emperl perlxsi.o emperl.o `$PERL -MExtUtils::Embed -e ldopts`
然后用以下命令测试了嵌入式解释器Sort::Key
module:
$ ./emperl -e 'print 123; use Sort::Key; print 456'
123456