为什么Perl的PAR不能找到Socket.pm的可加载对象?

时间:2009-02-27 19:10:16

标签: perl cpan multiplatform par

我正在使用PAR :: Packer在Cygwin上打包我的Perl应用程序,然后在HPUX上运行它。

一个简单的问候世界很有效,例如:

pp -p hello.pl

这会产生a.par,然后是HPUX:

parl a.par

效果很好。

然而,当使用-B bundle switch打包一个具有许多依赖关系的更大的应用程序时,没有这样的运气,而是我得到错误:

 Can't locate loadable object for module Socket in @INC

任何想法,也许是Windows / unix网络的一些问题?任何修复?

4 个答案:

答案 0 :(得分:5)

你之所以这样,是因为Socket加载了一个共享库,并且它不能跨平台移植(也就是说,Windows上的Socket共享库在Linux上不起作用将无法在HPUX上运行)。

您可以尝试两件事:

  1. 确定您需要共享库的所有位置,并在目标平台上进行本机安装。您可能还需要从PAR存档中排除这些模块。
  2. 切换到纯Perl实现((更多)可移植)。如果您不是Perl,C和您的目标平台的高手,并且还没有纯Perl版本,那么您可能会对此感到不满。

答案 1 :(得分:2)

在HPUX上安装实际perl的好处是你的cygwin应用程序可以在hpux perl上运行。 PAR包通常不会在任何两个平台之间起作用。在我看来,与在cygwin上生成hello.exe并尝试在HPUX上运行它并没有什么不同。

答案 2 :(得分:2)

Perl blixtor的评论建议我正在移动我在问题中的“编辑更新”来回答我自己的问题:

这里的大部分功劳归功于Andrew Barnett,其中两个关键问题是

  1. 原生C代码库
  2. perl LIB路径
  3. 以下是我为了让cygwin创建par在HPUX上运行所遵循的步骤,我相信任何unix上的步骤应该大致相同:

    按照安德鲁的建议并删除了IO :: Socket和 pp -X IO :: Socket 开关,但是然后在unix上运行生成的parl我得到了一些修改但仍然相关的错误:

    Can't locate Socket.pm in @INC (@INC contains: CODE(0x406ab018) CODE(0x4055c880) CODE(0x40563978)) at Net/Config.pm line 11
    

    即使在unix上运行“perl -MCPAN -e shell”,也显示Socket应该安装并且是最新的:

    cpan[2]> install IO::Socket
    IO::Socket is up to date (1.30_01).
    

    因此,除了使用-X开关abobe排除Socket之外,我还必须在HPUX上创建一个包装脚本,只需要输入1行,wrapper.pl:

    use PAR { file => 'bdiff.par', run => 'bdiff.pl' };
    

    然后运行这个我没有使用parl,而是我只是用perl调用它,我必须使用-I开关提供到默认lib路径的整个路径,如下所示:

    perl -I/lib/perl5/lib/5.10.0/PA-RISC2.0 -I/lib/lib/site_perl wrapper.pl allparameters
    

    由于某些原因,当使用parl时,似乎排除了默认的lib路径,因此上面的完整路径。

答案 3 :(得分:0)

FWIW,PAR并非设计为可在不同平台上移植 - 不要指望在cygwin上创建的par包可以在linux / hp ux上运行....