2

我知道还有另外两个问题在这里遇到了同样的问题,但我的问题来自实际尝试那里的建议,并希望从那时起还有其他一些对人们有用的选择。

设置是这样的:我有一个包含多个模块的应用程序,我想与安装了 Strawberry Perl 发行版的 Windows 机器上的某个人共享该应用程序。

它的结构是这样的:

PerlApp
 lib
   Base
     Base.pm
     Gui.pm
   Db
     Db.pm
     records.db
   Parser
     Parser.pm
   Utils
     Utils.pm
 PerlApp.pl
 Config.txt

这一切都有两个切入点。我可以通过带有 PerlApp.pl 脚本的命令行界面运行它,或者运行包含它的 Wx 界面的 Gui.pm 文件。

我正在运行带有从 CPAN 安装的几个模块的 Strawberry Perl,这些模块供该程序使用。我尝试使用 Cava Packager,不幸的是它不支持我开发的 perl 版本。

我试过pp但是打包 cmd 脚本产生的可执行文件会导致各种错误。我查阅了文档,但在我的一生中,我无法弄清楚如何使用这个模块来打包完整的目录树,或者是否支持它。(电话簿文件综合症)

我试过了

pp -o app.exe PerlApp.pl

错误是:

The locale codeset (cp1252) isn't one that perl can decode, stopped at Encode/Locale.pm line 94
Compilation failed in require at LWP/UserAgent.pm line 1000
Compilation failed in require at lib/Base/Base.pm line 9

最后的解决方案是打包所有需要的文件,并确定需要在外部机器上安装哪些 CPAN 模块才能使其工作,并最终要求用户自己手动安装它们。

4

1 回答 1

1

当我打包一个 perl 脚本时,我曾经遇到过与字符集(或 Windows 上的代码页)相关的类似错误。我到处搜索,但没有找到任何直接的答案,但最终我自己弄明白了。

  1. 实际上 Encode 模块能够解码 cp1252,真正的问题是在RUNTIMEEncode::Locale确定适当的字符集,但 PP 只是在编译时添加必要的依赖项(如果我可以说)。因此,您需要在命令中添加选项以添加运行时依赖项。-x
  2. 完全避免Encode::Locale。即使您将必要的解码器 pm 打包到可执行文件中,当它在具有不同字符集的另一个系统上运行时,也会发生类似的错误。我建议您找出代码的哪一行Encode::Locale并找出解决方法。
于 2014-04-17T14:55:51.047 回答