DynaLoader在@INC中看到错误的值

时间:2010-06-04 21:57:08

标签: perl

我安装了多个版本的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如何选择错误的路径,如何阻止它这样做呢?

2 个答案:

答案 0 :(得分:4)

与我为this question建议的方法类似,在@INC上加上跟踪,看看它何时更新。

在脚本的最顶部,在任何其他use语句之前,放置:

use Tie::Trace;
BEGIN { Tie::Trace::watch @INC };

然后当另一个模块编辑@INC数组时,您会收到一条警告消息。

答案 1 :(得分:3)

我明白了。问题是由几件事的相互作用引起的:

  • 我有与perl.exe相关联的* .pl文件(对于安装的最新版本的Perl - 5.12.1)。
  • 我的PATHEXT环境变量中有“.PL”,因此我可以在不输入扩展名的情况下运行Perl脚本。例如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(使用路径中的版本。)

叹息