4

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

一个简单的 hello world 运行良好,例如:

pp -p hello.pl

这导致 a.par 然后在 HPUX 上:

parl a.par

它工作得很好。

但是,当使用 -B 捆绑开关打包具有许多依赖项的更大应用程序时,没有这样的运气,而是出现错误:

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

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

4

4 回答 4

5

您之所以遇到这个问题,是因为 Socket 加载了一个共享库,并且它不能跨平台移植(也就是说,Windows 上的 Socket 共享库在 Linux 上不起作用,在 HPUX 上不起作用)。

你可以尝试两件事:

  1. 确定您需要共享库的所有位置,并在您的目标平台上进行本地安装。您可能还需要从 PAR 存档中排除这些模块。
  2. 切换到纯 Perl 实现((更多)可移植的)。如果您不是 Perl、C 和您的目标平台的专家,并且还没有纯 Perl 版本,那么您可能不走运。
于 2009-02-27T19:18:55.470 回答
2

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

于 2009-02-27T20:07:27.367 回答
2

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

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

  1. 本机 C 代码库
  2. perl LIB 路径

以下是我为使 cygwin 创建的 par 在 HPUX 上运行所遵循的步骤,我相信在任何 unix 上的步骤应该大致相同:

遵循 Andrew 的建议并使用pp -X IO::Socket开关删除了 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 开关排除 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 路径被排除在外,因此上面的完整路径。

于 2009-03-02T18:28:21.633 回答
0

FWIW,PAR 的设计目的不是跨不同平台可移植——不要指望在 cygwin 上创建的 par 包可以在 linux/hpux 上运行......

于 2011-08-13T20:33:17.320 回答