私が見ている問題は、perl
Cygwin (1.7.15、2012 年 9 月現在) で実行されているプロセスで間違ったバージョンのライブラリが読み込まれることです。
手短に言えば、 Daniel Veillard の XML 用 C ライブラリへの Perl インターフェイスであるdo をperl
開始し、Perl/C グルーが C ライブラリをロードします。現在、2 つのバージョンがインストールされています。古いバージョンが に、新しいバージョンが にあります。これは一般的なシナリオです。Perl/C グルー ライブラリ ( ) は、 の新しいバージョンに対してコンパイルされます。ただし、ライブラリのロードを担当する Perl または Cygwin コンポーネントは、古いものを選択します。これにより、Perl/C グルー コードによる警告がトリガーされます。これは、コンパイルされたバージョンを正しく期待し、要求します。(下位互換性のため、ほとんどの場合は引き続き機能しますが、意図したとおりには機能しません。)use XML::LibXML
libxml2
/usr/lib
/usr/local/lib
XML::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.dll
C ライブラリ(標準名libxml2
) がどのようにロードされるのかわかりません。
ldd
Perl/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_PATH
とLD_RUN_PATH
は無視されているように私には思えます。そうでない場合、バージョンの不一致の警告が表示されるのはなぜですか?
ライブラリの読み込みメカニズムは Cygwin または Cygwin に固有のものperl
ですか? それはどのように機能しますか?perl
Cygwin に適切なライブラリを作成またはロードするにはどうすればよいですか?
[私が持っている疑念の 1 つは、にperl
常駐して/usr/bin
いる場合、最初にそのバイナリのディレクトリであるでライブラリを検索するため/usr/bin
、UNIX の規則ではなく Windows の規則に従っているということです。]