我安装了多个版本的Perl;每个在不同的目录下。例如C:\Perl\5.x.y
。我通过设置PERL5LIB并更改我的PATH在shell中切换它们,以便一次只能看到一个版本。通常,这样可以正常工作,但是当尝试运行在5.10.1下安装的pp
(PAR :: Packer)版本时,我在加载XS组件时遇到问题。 parll2nc.exe抱怨:
此应用程序无法启动,因为找不到perl512.dll ...
我设置PERL_DL_DEBUG并在DynaLoader初始化时看到以下内容:
DynaLoader.pm loaded (C:/Perl/5.10.1/site/lib C:/Perl/5.12.1/lib ., \lib)
逗号之前的内容是@INC
。第一个条目是正确的,第二个条目是不是。我无法弄清楚DynaLoader如何获得5.12 lib路径,因为运行perl会直接显示我期望的内容:
C:\>perl -e "print join ' ', @INC"
C:/Perl/5.10.1/site/lib C:/Perl/5.10.1/lib .
DynaLoader如何选择错误的路径,如何阻止它这样做呢?
答案 0 :(得分:4)
与我为this question建议的方法类似,在@INC
上加上跟踪,看看它何时更新。
在脚本的最顶部,在任何其他use
语句之前,放置:
use Tie::Trace;
BEGIN { Tie::Trace::watch @INC };
然后当另一个模块编辑@INC
数组时,您会收到一条警告消息。
答案 1 :(得分:3)
我明白了。问题是由几件事的相互作用引起的:
C:\>foo
代替C:\>foo.pl
pp
实用程序的安装没有使用pl2bat
创建的批处理文件包装器。 (我不确定为什么。)最终结果是,当我运行pp @myconfig
时,它有效地执行了此操作:
C:\Perl\5.12.1\bin\perl.exe C:\Perl\5.10.1\site\bin\pp.pl @myconfig
即。它使用与* .pl文件关联的perl版本在我的路径中运行pp.pl的版本,不是我的PATH中的perl版本。因此,来自可执行文件(C:\ Perl \ _5.12.1 \ lib)的内容与来自PERL5LIB环境变量(C:\ Perl \ _5.10.1 \ site \ lib)之间的@INC
中的库混合)。
解决方案是运行pp
作为perl pp.pl
或(更好,因为您不必记住任何内容)来创建批处理包装器。假设.BAT在.PL之前的PATHEXT中,当您键入pp
时,Windows将运行pp.bat
而不是pp.pl
,而pp.bat
将调用perl
(使用路径中的版本。)
叹息