我正在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无法正确导入,“懒符号绑定”调试消息是什么意思?
答案 0 :(得分:1)
这通常是我在使用多个版本的perl和模块为一个版本编译时遇到的问题,然后不能为另一个版本工作但仍然坐在@INC中(我自己的错误是没有设置local :: lib路径每个perl有时候 - 由于我的遗忘,前几天因为EV而遇到了这个问题。)
测试的最佳方法是(备份当前模块)从@INC路径中删除模块,然后再次尝试重新编译它以查看是否能解决问题。
我推荐cpanm用于你的cpan和perl模块的安装需求:)