2

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

Perl が見るべきところに DBI フォルダと DBI.pm モジュールがあります! に含まれるパスに存在するファイルが@INCPerl で見つからないのはなぜですか?

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 が正しくインポートされないのはなぜですか? また、"lazy symbol binding" デバッグ メッセージは何を意味しますか?

4

1 に答える 1

1

これは、複数のバージョンの perl を使用し、あるバージョン用にコンパイルされたモジュールを使用し、別のバージョンでは動作しないが、まだ @INC に座っている場合によく発生する問題です (各 perl に local::lib パスを設定しないという私自身の間違いが時々あります) --先日、物忘れが原因でEVでこの問題に遭遇しました)。

テストする最善の方法は、(現在のモジュールをバックアップして) @INC パスからモジュールを削除し、再コンパイルして問題が解決するかどうかを確認することです。

cpan と perl モジュールのインストールのニーズにはcpanmをお勧めします:)

于 2012-09-30T03:22:08.717 に答える