2

我知道这很丑,但我需要在 Windows 上为客户端编译一个 perl 脚本,所以基本上我试图用我的 .pl 脚本制作一个 .exe。

我正在使用通过 cpan 安装的 PAR::Packer,并且在成功之前我编译了一堆简单的脚本。

它以前工作正常,但现在看起来不工作,因为我添加了 use Text::CSV;

它可以工作,但是当我运行 .exe 时,它​​会出现此错误:

Can't locate Text/CSV_PP.pm in @INC (@INC contains: CODE(0x25f1f84) C:\Users\user
\AppData\Local\Temp\par-6b6f6e74757a\cache-6d4baa68e36871e6407210ca47953c635f
81e612\inc\lib C:\Users\user\AppData\Local\Temp\par-6b6f6e74757a\cache-6d4baa6
8e36871e6407210ca47953c635f81e612\inc CODE(0x239f2ec) CODE(0x239f67c)) at (eval
18) line 2.
 at script/csvutil.pl line 5.
Compilation failed in require at script/csvutil.pl line 5.
BEGIN failed--compilation aborted at script/csvutil.pl line 5.

基本上我所做的是:

pp -o csvutil.exe csvutil.pl

我尝试通过以下方式添加强制加载模块:

pp -M Text::CSV csvutil.pl

我想我错过了一些东西......

我正在使用草莓 perl 5.16

代码开头:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Text::CSV;

my $file = $ARGV[0];
my @rows;
my $csv = Text::CSV->new ( { binary => 1 ,sep_char => ",",allow_loose_quotes => 1, eol=> $/, always_quote =>1 } )  # should set binary attribute.
             or die "Cannot use CSV: ".Text::CSV->error_diag ();

     ...# basically print all the lines
4

3 回答 3

3

Text::CSV 实际上只是一个界面。它自动确定使用哪个后端模块:纯 Perl Text::CSV_PP 或 XS(C 代码)Text::CSV_XS。PAR 正在检测对 Text::CSV 的静态依赖,但无法解析动态依赖。更改您的-M选项以包括 Text::CSV_XS 或 Text::CSV_PP。如果您安装了 XS 版本,请捆绑它。它要快得多。

于 2013-01-10T16:02:31.900 回答
0

路径可能有问题@INC。或许你可以在这里找到你的答案

于 2013-01-10T18:11:31.777 回答
0

我建议远离 PAR 并使用Cava Packager。我过去使用过 PAR,无论我是否会打包应用程序,都会受到打击或错过。它似乎不能很好地处理某些模块,当你遇到一个它无法处理的时候,资源是稀疏的,而且修复通常是肮脏的 hack。Gtk+/Tk 应用程序确实给 PAR 带来了困难。

另一方面,Cava Packager 非常健壮、积极维护,并且能够处理我扔给它的所有模块。它允许您/社区创建有关如何处理特定模块的特殊情况的规则。我遇到的任何问题都已通过活动邮件列表快速解决。它提供了一个 GUI 来配置项目设置。它支持 InnoSetup 在打包应用程序时自动创建安装程序。它得到积极维护,目前正在努力成为开源。在我找到 Cava Packager 之前,我几乎放弃了将 perl 脚本打包为可执行文件以进行分发的想法。Cava 超出了我在使用 PAR 和 ActiveState 的 perl2exe 后设定的预期。听起来我是 Cava 的开发人员,但我真的不是!非常高兴。

我知道这并不能完全回答您提出的问题,但它确实解决了您的问题,我认为您可能会发现 Cava 和我一样有用。

于 2013-01-11T18:54:41.240 回答