检测编译的 perl 脚本是否动态加载模块

Detect whether compiled perl script dynamically loads modules

我 运行宁 Windows 10 与草莓 Perl。我使用 PAR::Packer 模块制作我的一些 Perl 脚本的可执行版本。

我发现一些模块,例如XML::LibXML,需要安装 Perl 才能 运行 可执行文件。因为我是为没有 Perl 的用户编译这些,所以这违背了编译的目的。

有什么方法可以在编译前判断可执行文件是否需要将 Perl 安装到 运行?

假设您想知道,如果您的 pp 打包的可执行文件将 运行 在没有安装 perl 的系统上,我是这样做的:

从 sysinternals.com 获取 Process Explorer。
打包您的可执行文件。
运行 可执行文件并在 ProcessExplorer
中检查进程的 dll (view->'show lower pane' and view->'lower pane view'->'DLLs')
如果您看到任何 dll 引用的路径不是 PAR 临时目录或系统库,它们存在于任何 windows 系统上,请返回,再次打包并使用 pp 的 -l 开关添加这些库。

示例:

pp -e "use XML::LibXML; while(1){sleep 1}"

运行宁a.exe ...
Process Explorer 显示

libxml2-2_.dll ... C:\Users\user\perl522\c\bin\libxml2-2_.dll

这不会出现在用户系统上...
Re运行宁页:

pp -l libxml2-2_.dll -e "use XML::LibXML; while(1){sleep 1}"

这次运行宁a.exe ...
Process Explorer 显示:

libxml2-2_.dll ... C:\Users\user\AppData\Local\Temp\par-xxx\cache-SHA1\libxml2-2_.dll

现在进程选择与 pp 捆绑在一起的库并提取到 PARs 缓存目录。

干杯,克里斯