0

如果 Perl 代码使用 fork 或其变体,如 Paralell::Loops 或 Parallel::ForkManager,则来自 Par::Packer 的 pp 生成的独立 exe 将在运行时崩溃,请参阅https://groups.google.com/forum/?fromgroups中的示例#!topic/perl.par/U4HbbbcRRTQ。B::C 或 B::CC 也被测试在这种情况下不起作用:activeperl 甚至无法安装它,显示如下错误:

C.obj:错误 LNK2001:未解析的外部符号 Perl_Iwatchaddr_ptr
C.obj:错误 LNK2001:未解析的外部符号 Perl_Iwatchok_ptr

cygwin perl 可以按照https://github.com/rurban/perl-compiler中的说明安装和生成 exe ,但是当我们运行它时,它会因错误而崩溃,例如END failed--call queue abortedCouldn't print to pipe。是否有一些经过测试的可用于 fork 的 Perl 编译器或打包器?

4

1 回答 1

0

将所有代码包含在 END {} 中,并将使用更改为require,如require Parallel::Loops。对于那些隐含的依赖模块,在 pp 中显式包含它们,例如:

pp -M Params::Validate::XS -M Params::Validate::PP -M Class/Load/XS.pm -M Class/Load/PP.pm -o some-code.exe some-code.pl

如果脚本不需要在父子之间共享数据,我们也可以使用 MCE,它有一个与 pp 兼容的使用线程选项,我们不需要 END {} 方法。

于 2013-07-29T18:58:40.447 回答