如何将Perl编译成exe文件

原文地址:

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.975
ppm install http://www.bribes.org/perl/ppm/PAR-Packer.ppd

第三步:这时已经可以使用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文件中提取
Static.pm和
Dynamic.pm两个文件(par可以用zip打开),用这两个文件替换C:/Perl/site/lib/PAR/StrippedPARL目录下的同名文件。

第六步:打开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!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值