2009年8月29日土曜日

(FreeBSD) /libexec/ld-elf.so.1: Shared object "libopenjpeg.so.2" not found, required by "evince"

最近、GNOME2な環境で、PDFファイルをダブルクリックしても表示されないな~と思ってたんです。Adobe Readerでなら表示できるので、ま、いいかと、しばらく放置していたんですが、気持ち悪いので、ようやく調べてみました。



PDFはevinceというツールで表示されるようになっていました。しかし



% evince
/libexec/ld-elf.so.1: Shared object "libopenjpeg.so.2" not found, required by "evince"

ということで、libopenjpegという共有ライブラリが見つからないのが原因でした。




先日
も書いたんですが、



  • ある1台のFreeBSDマシン(A)でだけ、portsを使って、make packageや、「portupgrade -p ナニナニ」でbinaryパッケージを作成する


  • そのほかのFreeBSDマシン(B)では、「portupgrade -PP ナニナニ」で、binaryパッケージを使ってアップデートする


ということをやってます。



今回は、(B)で、libopenjpegが見つからないというエラーになっていて、(A)では、libopenjpeg.so.10があって、ちゃんとevinceが動きます。



(A)で調べてみました。



% pkg_which /usr/local/lib/libopenjpeg.so.2
openjpeg-1.3_1



% pkg_info -R openjpeg-1.3_1
Information for openjpeg-1.3_1:



Required by:
blender-2.49a_1



(B)ではblenderはインストールしていませんでした。そのためopenjpegもインストールされていませんでした。



とりあえず、(B)では、pkg_addでopenjpegをインストールすれば、evinceが動くようになります。



結局、evinceからopenjpegへの依存関係が、portsでは記録されていないのに、実際には依存関係ができてる、というのが問題ですね。



以前も

(FreeBSD) portsのdevel/gettextは、textproc/libcrocoに依存していないようで、実は依存してる

ということがあったように、どうも、portsでは、この依存関係の漏れが、たびたびあるようです。



一概にportsがおかしい、というわけではなくて、たとえば今回の場合、openjpegが無い環境でevinceをビルドすると、openjpegを使わないevinceができあがるはずです。



たまたまインストールされている共有ライブラリを、configureスクリプトで発見してしまって、リンクされるようになる・・・でも、portsはそんなこと知らなかったよ、という感じ。



portsでinstallするときに、リンクされている共有ライブラリを調べて、自動的に依存関係を追加して記録してくれる、とかできるといいかも知れないですが、portsでの処理が重くなってしまうかも。



まあ、地道にportsのほうで対応をしていき、「もしかすると使われるかもしれない、その他のソフト」をきちんと把握して、make configで選択できるようにしたり、WITH_ホゲで、使う/使わないを指定できるようにするのが、正しい解決方法な気もします。





ちなみに、evinceが直接openjpegに依存しているわけではなくて、



  • evinceはpopplerに依存していて、


  • popplerはopenjpegに依存している、


という関係になっていました。



% ldd /usr/local/lib/libpoppler.so.4
/usr/local/lib/libpoppler.so.4:
        libjpeg.so.10 => /usr/local/lib/libjpeg.so.10 (0x2818c000)
        libopenjpeg.so.2 => not found (0x0)
        libxml2.so.5 => /usr/local/lib/libxml2.so.5 (0x284a9000)
        libfreetype.so.9 => /usr/local/lib/libfreetype.so.9 (0x285ce000)
        libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1 (0x281c0000)
        libz.so.4 => /lib/libz.so.4 (0x281e9000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x28640000)
        libm.so.5 => /lib/libm.so.5 (0x28735000)
        libc.so.7 => /lib/libc.so.7 (0x28089000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2874a000)
        libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28755000)
        libexpat.so.6 => /usr/local/lib/libexpat.so.6 (0x2884e000)





poppler-0.10.6のconfigureスクリプトでは、openjpegを使うかどうか、コントロールできるようになっているみたいです。



% ./configure --help | grep -i openjpeg
  --disable-libopenjpeg   Don't build against libopenjpeg.



0 件のコメント:

コメントを投稿