【问题标题】:Perl compiled by PAR::Packer doesn't run on other machinesPAR::Packer 编译的 Perl 不能在其他机器上运行
【发布时间】:2017-11-22 20:17:09
【问题描述】:

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

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

我只能通过安装 ActiveTcl 8.5.15、ActivePerl 5.16、通过 PPM Win32::API 和 Win32::Exe、tk、tkx、Carp 安装,然后通过 cpanp i 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 窗口没有打开,控制台和任何提示都没有产生错误。

【问题讨论】:

  • 要获取更多诊断信息,请停止使用 --gui 选项并打开 metacpan.org/pod/PAR::Environment#PAR_GLOBAL_DEBUG 您也可以清空 %path% 以在同一台机器上测试生成的 exe
  • 谢谢。实际上我自己找到了解决方案,就是这个块“BEGIN { if (exists $ENV{PAR_PROGNAME}) { use Config (); $ENV{PERL_TCL_DL_PATH} = catfile($ENV{PAR_TEMP}, 'tkkit.' . $ Config::Config{dlext}, ); } }" 需要出现在 "use Tkx;" 之前正确指示 PAR::Packer 获取 Tcl 的必要部分以打包程序。因此,必要的库被遗漏了,可执行文件正在搜索 %path% 中不存在的 ActiveTcl 安装。但是感谢您提供有关用于调试的附加模块的详细信息。
  • 如果你的问题得到解决,你应该把你的解决方案写成答案(这比包含无格式代码的冗长评论更容易阅读)。
  • 啊,我不知道我可以。在这篇文章之前我没有足够的代表点来做到这一点。谢谢。

标签: windows perl


【解决方案1】:

感谢所有回复的人。

其实我自己也找到了解决办法,就是这个块

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

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

【讨论】:

    【解决方案2】:

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

    1. pp --compile --noscan --dependent --compress 6 hello.pl
    2. 将生成的.exe和需要的dlls复制到一个目录下,并将该目录重命名为bin
    3. 将 tcl 和 tk 库复制到与 bin 相同层次结构的 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

    顺便说一句,整个文件夹可以在我的机器上通过 7-zip 压缩到大约 2.7MB

    【讨论】:

    • 顺便说一句,运行set path= &amp;&amp; hello.exe 测试它是否可以在其他机器上运行。
    猜你喜欢
    • 2022-06-16
    • 2012-12-25
    • 1970-01-01
    • 2014-02-06
    • 2015-05-27
    • 2021-12-18
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多