我正在使用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网络的一些问题?任何修复?
答案 0 :(得分:5)
你之所以这样,是因为Socket加载了一个共享库,并且它不能跨平台移植(也就是说,Windows上的Socket共享库在Linux上不起作用将无法在HPUX上运行)。
您可以尝试两件事:
答案 1 :(得分:2)
在HPUX上安装实际perl的好处是你的cygwin应用程序可以在hpux perl上运行。 PAR包通常不会在任何两个平台之间起作用。在我看来,与在cygwin上生成hello.exe并尝试在HPUX上运行它并没有什么不同。
答案 2 :(得分:2)
Perl blixtor的评论建议我正在移动我在问题中的“编辑更新”来回答我自己的问题:
这里的大部分功劳归功于Andrew Barnett,其中两个关键问题是
以下是我为了让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上运行....