微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将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!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐