最近、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 件のコメント:
コメントを投稿