Perl找不到@INC中的模块

时间:2012-08-08 20:15:31

标签: macos perl

我正在OS X 10.7 Mac上编写一个Perl模块,当我尝试使用它时,我遇到了DBI模块的错误。我能够将问题与我的模块分开,并将其重现为:

[sean@mac:~]$ perl -e 'use DBI;'
Can't locate DBI.pm in @INC (@INC contains:
    /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level
    /opt/local/lib/perl5/site_perl/5.12.4
    /darwin-multi-2level
    /opt/local/lib/perl5/site_perl/5.12.4
    /opt/local/lib/perl5
    /vendor_perl/5.12.4/darwin-multi-2level
    /opt/local/lib/perl5/vendor_perl/5.12.4
    /opt/local/lib/perl5/5.12.4/darwin-multi-2level
    /opt/local/lib/perl5/5.12.4
    /opt/local/lib/perl5/site_perl
    /opt/local/lib/perl5/vendor_perl .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

令人费解的原因是:

[sean@mac:~]$ find /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level -iname '*dbi*' -maxdepth 2
  /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level/auto/DBI
  /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level/Bundle/DBI.pm
  /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level/DBI
  /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level/DBI.pm
  /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level/dbixs_rev.pl

有一个DBI文件夹和一个DBI.pm模块,Perl应该在哪里看!为什么Perl找不到@INC中包含的路径中存在的文件?

我能够通过扭曲Perl的手臂找到解决方法:当我向模块添加use lib '/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level';行时,Perl似乎正确地找到了DBI。但是,在这种情况下,perl -d foo.pm会产生以下结果:

  dyld: lazy symbol binding failed: Symbol not found: _Perl_Gthr_key_ptr
    Referenced from: /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level/auto/DBI/DBI.bundle
    Expected in: flat namespace

  dyld: Symbol not found: _Perl_Gthr_key_ptr
    Referenced from: /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level/auto/DBI/DBI.bundle
    Expected in: flat namespace

  Trace/BPT trap: 5

我不知道如何解释这一点,所以我对我的解决方法不满意 - 它仍然有“如果你不喜欢将来会成为一个令人讨厌的惊喜的潜在问题”的味道弄明白。“

为什么DBI无法正确导入,“懒符号绑定”调试消息是什么意思?

1 个答案:

答案 0 :(得分:1)

这通常是我在使用多个版本的perl和模块为一个版本编译时遇到的问题,然后不能为另一个版本工作但仍然坐在@INC中(我自己的错误是没有设置local :: lib路径每个perl有时候 - 由于我的遗忘,前几天因为EV而遇到了这个问题。)

测试的最佳方法是(备份当前模块)从@INC路径中删除模块,然后再次尝试重新编译它以查看是否能解决问题。

我推荐cpanm用于你的cpan和perl模块的安装需求:)