PAR :: Packer编译的Perl不能在其他机器上运行

时间:2014-01-08 22:54:07

标签: windows perl

我有一个现有的2000 LOC perl脚本和一个Tkx GUI,我刚刚在第一天作为实习生继承我是唯一的程序员(其他人都是IC工程师,但是他们在perl中进行模拟) )。

目标是为客户端生成可执行文件,而无需安装perl或其他任何东西。显然这在过去是可能的。

我只能通过安装ActiveTcl 8.5.15,ActivePerl 5.16,通过PPM Win32 :: API和Win32 :: Exe,tk,tkx,Carp安装来构建程序,然后通过cpanp安装我的PAR ::帕克。这个非常具体的组合是我发现的唯一一个产生任何效果的结果。

然后是:

pp -vvv -l C:\Perl\lib\auto\Tcl\tkkit.dll -l C:\Perl\lib\auto\Tcl\Tcl.dll -l C:\Perl\lib\auto\Win32\API\API.dll --gui -o .\<THE NAME OF THE FILE.EXE> .\<PERL SOURCE>.pl

从这里我得到一个可用的可执行文件,除了它不会在我测试过的任何其他机器上运行。据我所知,这不是一个拱门问题。

前一位开发人员的文档非常缺乏这一主题(他更擅长记录实际代码)。我被告知他将它迁移到StrawberryPerl然后在它崩溃的时候回到ActivePerl,但是到现在为止它仍然很糟糕,现有的构建环境早已不复存在。

任何帮助都将不胜感激。

操作:使用PAR :: Packer pp从perl脚本编译Windows二进制文件,以便客户端可以在不使用perl的情况下运行它

预期结果:tk GUI窗口打开并保持打开状态。

实际结果:tk GUI窗口无法打开,控制台或任何提示中都不会产生错误。

2 个答案:

答案 0 :(得分:1)

感谢所有回复的人。

我实际上自己找到了解决方案,就是这个块

BEGIN { if (exists $ENV{PAR_PROGNAME}) { use Config (); $ENV{PERL_TCL_DL_PATH} = catfile($ENV{PAR_TEMP}, 'tkkit.' . $Config::Config{dlext}, ); } }

需要出现在“使用Tkx”之前;正确地指示PAR :: Packer抓取Tcl的必要部分来打包程序。因此,遗漏了必要的库,可执行文件正在%path%中搜索不存在的ActiveTcl安装。但是,感谢您提供有关调试的附加模块的详细信息。

答案 1 :(得分:0)

这是我在Windows 7上使用草莓perl 5.26.1 tkx 1.09 的解决方案:

  1. pp --compile --noscan --dependent --compress 6 hello.pl
  2. 将生成的 .exe dll 复制到目录,并将此目录重命名为 bin
  3. 将tcl和tk库复制到与 bin
  4. 相同的层次结构上的 lib 目录

    现在我生成的文件结构:

    $ tree -L 2 . ├── bin │   ├── hello.exe │   ├── hello.pl │   ├── libgcc_s_dw2-1.dll │   ├── libstdc++-6.dll │   ├── libwinpthread-1.dll │   ├── perl526.dll │   ├── tcl86.dll │   ├── tk86.dll │   └── zlib1.dll └── lib ├── tcl8.6 └── tk8.6

    BTW,整个文件夹可以通过我的机器上的7-zip压缩到大约 2.7MB