原文地址:
http://hi.baidu.com/%CD%A9%CD%A9_vivian/blog/item/f29466d122015c8aa0ec9cd9.html
今天突然想把自己的perl代码编译成exe文件,网上搜了一下,看来还有不少人对这个问题研究的很深入。
按照他们的建议逐步操作,遇到了新的问题,但是最终还是顺利解决。很开心。记录一下,备忘:
很多人都想把 perl 脚本编译成exe 以便脱离 perl 解释器独立运行。
一般创建的exe的方法如下:
1.使用 perl2exe 工具(需要购买)
2.使用 ActiveState 公司的 Perl Dev Kit (需要购买)
那么有没有免费的方案呢?
今天发现的方法就可以完全满足大家。
首先我们安装需要的模块,这里以 windows 平台下的 ActivePerl 为例
(Windows 下的最通用发行版本)。
打开 ppm,安装一下模块:
Parse-Binary, Win32-Exe, Module-ScanDeps, PAR-Dist, PAR
安装PAR比较麻烦,这里是如何安装,以及如何解决碰到的问题:
第一步:ppm install par
这个比较简单,当然如果幸运的话,你应该可以直接使用par了,但是我没有那么幸运,因为安装之后找不到pp.bat,实际上这是ActivePerl的问题,没办法只能往下继续了。
第二步:重新安装par-packer
不过之前要更新一个模块File-Temp,我原来的版本是0.12,太低,换成0.18的ppm install http://www.bribes.org/perl/ppm/File-Temp.ppd
然后安装par-packer 0.975ppm install http://www.bribes.org/perl/ppm/PAR-Packer.ppd
Static.pm和Dynamic.pm两个文件(par可以用zip打开),用这两个文件替换C:/Perl/site/lib/PAR/StrippedPARL目录下的同名文件。
第三步:这时已经可以使用pp.bat了,但是你会发现pp不能生成exe文件,总是报
erl lib version (v5.8.8) doesn't match executable version (v5.8.6)的错误,
原因在于二进制不兼容,需要继续修改。
第四步:下载5.8.8的par-packer
http://www.perl.com/CPAN/authors/id/S/SM/SMUELLER/PAR-Packer-0.975-MSWin32-x86-multi-thread-5.8.8.par
第五步:从par文件中提取
第六步:打开C:/Perl/site/lib/PAR/StrippedPARL目录下的base.pm,将第71行修改为
my @libs = (map {"-I/"$_/""} @INC);
第七步:执行pp -o t.exe t.pl,一切都OK了。
(par生成的可执行文件比较大,这是个缺点)
我在按照以上步骤安装PAR后,发现还是不能生成exe文件,错误信息如下:
The procedure entry point perl_sv_2iv_flags could not be located in the dynamic link library perl58.dll
这个问题应该是ActiveState的版本问题,我的komodo版本是3.5.2,google了一下,发现有解决方案:
For ActiveState build 822 you can download the PAR dist from
http://backpan.perl.org/authors/id/S/SM/SMUELLER/PAR-Packer-0.976-MSWin32-x86-multi-thread-5.8.8.par
and install it with:
perl -MPAR::Dist -e"install_par( 'PAR-Packer-0.976-MSWin32-x86-multi-thread-5.8.8.par' )
也就是说,上面的第四步,应该到perl -MPAR::Dist -e"install_par( 'PAR-Packer-0.976-MSWin32-x86-multi-thread-5.8.8.par' ) 去下载PP。继续第五步。跳过第六步。直接在命令行中运行pp命令即可。不过需要注意的是,命令行中需要使用pp.bat的完整路径,否则会出现pp is not recongnized as an internal or external command的错误。
例子:
使用你喜欢的编辑器,进行编辑:
#! /usr/bin/perl -w
use strict;
print "Hello,world!/n";
#:~
保存为 hello.pl。
接下来我们进行编译,在控制台下输入:
c:/perl/site/bin/pp -o c:/vivian/hello.exe c:/vivian/hello.pl
好了,检查一下生成的 hello.exe 吧,除了生成的有些大,没什么问题(我的大概 1.3M)。
建议不要使用压缩软件,比如 UPX 等,否则会有一些附加错误信息。
我们也可以生成 gui 程序,代码如下:
#! /usr/bin/perl -w
use strict;
use Tk;
my $wm = MainWindow->new;
my $label = $wm->Label(-text => "Hello,world!");
$label->pack;
$label->bind('' => sub {$wm->destroy});
MainLoop;
#:~
好,保存为 hellogui.pl,我们通过命令:
pp --gui -o hellogui.exe hellogui.pl
得到 hellogui.exe,大概 2.3M 左右,如果高兴,可以用 UPX 压缩,压缩后在 1.9M 左右。
你也可以设定自己的 icon,具体的方法和其他说明信息可以使用perldoc pp 命令查询。
另外,还有一个 gui 版本的 shell,你可以通过运行 tkpp 执行。
Enjoy!