1

私が見ている問題は、perlCygwin (1.7.15、2012 年 9 月現在) で実行されているプロセスで間違ったバージョンのライブラリが読み込まれることです。

手短に言えば、 Daniel Veillard の XML 用 C ライブラリへの Perl インターフェイスであるdo をperl開始し、Perl/C グルーが C ライブラリをロードします。現在、2 つのバージョンがインストールされています。古いバージョンが に、新しいバージョンが にあります。これは一般的なシナリオです。Perl/C グルー ライブラリ ( ) は、 の新しいバージョンに対してコンパイルされます。ただし、ライブラリのロードを担当する Perl または Cygwin コンポーネントは、古いものを選択します。これにより、Perl/C グルー コードによる警告がトリガーされます。これは、コンパイルされたバージョンを正しく期待し、要求します。(下位互換性のため、ほとんどの場合は引き続き機能しますが、意図したとおりには機能しません。)use XML::LibXMLlibxml2/usr/lib/usr/local/libXML::LibXML/usr/local/lib

注意すべきことの 1 つは、Cygwinlib/libxml2.so.2では ではなくbin/cygxml2-2.dll!

画面からコピーされたアクションは次のとおりです。

MiLu@Dago: /tmp > export LD_LIBRARY_PATH=/usr/local/bin
MiLu@Dago: /tmp > export LD_RUN_PATH=/usr/local/bin
MiLu@Dago: /tmp > ls -l /usr/bin/cygxml2-2.dll
-rwxr-xr-x 1 MiLu root 1096206  1. Mrz 2012  /usr/bin/cygxml2-2.dll
MiLu@Dago: /tmp > ls -l /usr/local/bin/cygxml2-2.dll
-rwxr-xr-x 1 MiLu None 3997813 21. Mai 22:35 /usr/local/bin/cygxml2-2.dll
MiLu@Dago: /tmp > perl -MXML::LibXML -e1
Warning: program compiled against libxml 208 using older 207
Warning: XML::LibXML compiled against libxml2 20800,
                 but runtime libxml2 is older 20708

cygxml2-2.dllC ライブラリ(標準名libxml2) がどのようにロードされるのかわかりません。

lddPerl/C グルー ライブラリの出力は次のとおりです。

$ ldd /usr/lib/perl5/site_perl/5.14/i686-cygwin-threads-64int/auto/XML/LibXML/LibXML.dll
    ntdll.dll       => /cygdrive/c/Windows/SysWOW64/ntdll.dll (0x774a0000)
    kernel32.dll    => /cygdrive/c/Windows/syswow64/kernel32.dll (0x756c0000)
    KERNELBASE.dll  => /cygdrive/c/Windows/syswow64/KERNELBASE.dll (0x76750000)
    cygwin1.dll     => /usr/bin/cygwin1.dll (0x61000000)
    cygssp-0.dll    => /usr/bin/cygssp-0.dll (0x6af50000)
>>> cygxml2-2.dll   => /usr/local/bin/cygxml2-2.dll (0x63fc0000) <<<
    cygz.dll        => /usr/bin/cygz.dll (0x6a900000)
    cyggcc_s-1.dll  => /usr/bin/cyggcc_s-1.dll (0x6ca60000)
    cygiconv-2.dll  => /usr/bin/cygiconv-2.dll (0x6c390000)
    cygperl5_14.dll => /usr/bin/cygperl5_14.dll (0x6b8a0000)
    cygcrypt-0.dll  => /usr/bin/cygcrypt-0.dll (0x6d3d0000)
    ???             => ??? (0x520000)

ご覧のとおり、UNIX の場合と同様に、新しいライブラリが正しく配置されています。しかしldd、これは実際のプロセスではなく、別のルックアップ メカニズムを使用する可能性があります。

を使用するとstrace perl … | grep -i cygxml、出力が表示されません。

LD_LIBRARY_PATHLD_RUN_PATHは無視されているように私には思えます。そうでない場合、バージョンの不一致の警告が表示されるのはなぜですか?

ライブラリの読み込みメカニズムは Cygwin または Cygwin に固有のものperlですか? それはどのように機能しますか?perlCygwin に適切なライブラリを作成またはロードするにはどうすればよいですか?

[私が持っている疑念の 1 つは、にperl常駐して/usr/binいる場合、最初にそのバイナリのディレクトリであるでライブラリを検索するため/usr/bin、UNIX の規則ではなく Windows の規則に従っているということです。]

4

2 に答える 2

1

Alien::Base を作成する際、DynaLoader を使用して特定のライブラリを直接 dlopen する必要がありました。ここでコードを読むことができますが、簡単で汚いものは単純にする必要があります

require DynaLoader;
DynaLoader::dl_load_file( $library_path, 0x01 )
于 2012-09-24T02:02:16.830 に答える
0

cygwin は LD_LIBRARY_PATH をサポートしています。スクリプトの冒頭で期待どおりに設定されていることを確認してください。

BEGIN { print "LD_LIBRARY_PATH: $ENV{LD_LIBRARY_PATH}.\n" }
于 2012-09-23T21:48:35.773 に答える