perl - 使用 Strawberry Perl,如何将Perl脚本(. pl ) 编译为 Windows 可执行文件( exe )


最简单的方法是什么编译一个简单的perl脚本与 Strawberry Perl ( 我知道这是可以和自由的) Windows 下一个可执行的。

过去我使用ActiveState编译器和 perl2exe,很简单。 然而,在一些计算机更改和操作系统更新之后,我已经失去了许可证,我想找到一个更好的/永久解决方案。


时间: 原作者:

从cpan安装 PAR::Packer ( 是免费的) 和使用pp效用。


 :: short answer :
 :: perl -MCPAN -e"install PAR::Packer" 
 pp -o <<DesiredExeName>>.exe <<MyFancyPerlScript>> 

 :: long answer - create the following cmd, adjust vars to your taste.. .
 :: next_line_is_templatized
 :: v1.0.0
 :: disable the echo
 @echo off

 :: this is part of the name of the file - not used
 set _Action=run

 :: the name of the Product next_line_is_templatized
 set _ProductName=morphus

 :: the version of the current Product next_line_is_templatized
 set _ProductVersion=1.2.3

 :: could be dev, test, dev, prod next_line_is_templatized
 set _ProductType=dev

 :: who owns this Product/environment next_line_is_templatized
 set _ProductOwner=ysg

 :: identifies an instance of the tool ( new instance for this version could be created by simply changing the owner ) 
 set _EnvironmentName=%_ProductName%.%_ProductVersion%.%_ProductType%.%_ProductOwner%

 :: go the run dir
 cd %~dp0

 :: do 4 times going up
 for/L %%i in (1,1,5) do pushd.. 

 :: The BaseDir is 4 dirs up than the run dir
 set _ProductBaseDir=%CD%
 :: debug echo BEFORE _ProductBaseDir is %_ProductBaseDir%
 :: remove the trailing 

 IF %_ProductBaseDir:~-1%== SET _ProductBaseDir=%_ProductBaseDir:~0,-1%
 :: debug echo AFTER _ProductBaseDir is %_ProductBaseDir%
 :: debug pause

 :: The version directory of the Product 
 set _ProductVersionDir=%_ProductBaseDir%%_ProductName%%_EnvironmentName%

 :: the dir under which all the perl scripts are placed
 set _ProductVersionPerlDir=%_ProductVersionDir%sfwperl

 :: The Perl script performing all the tasks

 :: where the log events are stored 
 set _RunLog=%_ProductVersionDir%datalogcompile-%_ProductName%.cmd.log

 :: define a favorite editor 
 set _MyEditor=textpad

 ECHO Check the variables 
 set _
 :: debug PAUSE
 :: truncate the run log
 echo date is %date% time is %time%> %_RunLog%

 :: uncomment this to debug all the vars 
 :: debug set>> %_RunLog%

 :: for each perl pm and or pl file to check syntax and with output to logs
 for/f %%i in ('dir %_ProductVersionPerlDir%*.pl/s/b/a-d' ) do echo %%i>> %_RunLog%&perl -wc %%i | tee -a %_RunLog% 2>&1

 :: for each perl pm and or pl file to check syntax and with output to logs
 for/f %%i in ('dir %_ProductVersionPerlDir%*.pm/s/b/a-d' ) do echo %%i>> %_RunLog%&perl -wc %%i | tee -a %_RunLog% 2>&1

 :: now open the run log
 cmd/c start/max %_MyEditor% %_RunLog%

 :: this is the call without debugging
 :: old 
 echo CFPoint1 OK The run cmd script %0 is executed>> %_RunLog%
 echo CFPoint2 OK compile the exe file STDOUT and STDERR to a single _RunLog file>> %_RunLog%
 cd %_ProductVersionPerlDir%

 pp -o %_Action%_%_ProductName%.exe %_PerlScript% | tee -a %_RunLog% 2>&1 

 :: open the run log
 cmd/c start/max %_MyEditor% %_RunLog%

 :: uncomment this line to wait for 5 seconds
 :: ping localhost -n 5

 :: uncomment this line to see what is happening 

 :: Purpose: 
 :: To compile the whole perl files into single executable 
 :: Requirements : 
 :: perl, pp, win gnu utils tee 
 :: perl -MCPAN -e"install PAR::Packer" 
 :: text editor supporting <<textEditor>> <<FileNameToOpen>> cmd call syntax
 :: VersionHistory
 :: 1.0.0 --- 2012-06-23 12:05:45 --- ysg --- Initial creation from run_morphus.cmd
 :: next_line_is_templatized
 :: eof v1.0.0


编译器::: c,

( 注意:perlfaq3仍然错误)

对于 Strawberry,你需要来自git主( 1.43 )的perl-5.16 和 B-C,因为 B-C-1.42 不支持 5.16.

这是一个循序渐进的示例,它使用 Strawberry,它可以工作 ! 它基于 ExtUtils::Embed 模块和perlembed文档