Image::Magick(PerlMagick)でpngファイルが読み込めないエラー

CentOS6.3/Perlbrewな環境でImage::Magick(PerlMagick)を動かそうとしたらこんなエラーが出ました。
Exception 420: no decode delegate for this image format `hoge.png' @ error/constitute.c/ReadImage/544 a
どうも"libpng"が入ってないのが原因のようなので、早速ダウンロードしてコンパイル&インストール。 http://www.libpng.org/pub/png/libpng.html
wget "http://prdownloads.sourceforge.net/libpng/libpng-1.5.13.tar.gz?download"
tar xvfz libpng-1.5.13.tar.gz
cd libpng-1.5.13
./configure
make
sudo make install
念のためImageMagickも再コンパイル&インストール。
ついでにOpenMPとXを無効にしときます。
./configure --disable-openmp --without-x
そしてPerlスクリプトを実行!
・・・今度は別のエラーが!
Can't load '/home/hoge/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/auto/Image/Magick/Magick.so' 
for module Image::Magick: libpng15.so.15: 共有オブジェクトファイルを開けません:
 そのようなファイルやディレクトリはありません
 at /home/hoge/perl5/perlbrew/perls/perl-5.16.1/lib/5.16.1/x86_64-linux/DynaLoader.pm line 190.
PerlMagickのディレクトリに入ってmake testしてみたら同じエラーでこけました。

libとか.soファイル関係って、何か苦手なんですよね。
シェアードオブジェクトか何とかlddとかldconfigが何とかのアレなんでしょうけど。
自分でC言語を書いて.soファイルを作って使ってみるまでは、永遠に苦手状態から抜け出せないのかもしれません。

さて、こちらのサイトにヒントがありました。
http://cooldaemon.tumblr.com/post/59115759/centos-imagemagick-source-perlmagick

さっそくlddで調べてみました。
$ ldd /home/hoge/perl5/perlrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/auto/Image/Magick/Magick.so
        linux-vdso.so.1 =>  (0x00007fff2a898000)
        libMagickCore.so.5 => /home/hoge/src/ImageMagick-6.7.9-2/PerlMagick/../magick/.libs/libMagickCore.so.5 (0x00007f230d9cf000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f230d743000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f230d3b0000)
        liblcms.so.1 => /usr/lib64/liblcms.so.1 (0x00007f230d177000)
        libtiff.so.3 => /usr/lib64/libtiff.so.3 (0x00007f230cf12000)
        libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00007f230cc75000)
        libjasper.so.1 => /usr/lib64/libjasper.so.1 (0x00007f230ca1c000)
        libjpeg.so.62 => /usr/lib64/libjpeg.so.62 (0x00007f230c7f7000)
        libpng15.so.15 => not found
        libXext.so.6 => /usr/lib64/libXext.so.6 (0x00007f230c5e5000)
        libXt.so.6 => /usr/lib64/libXt.so.6 (0x00007f230c37f000)
        libSM.so.6 => /usr/lib64/libSM.so.6 (0x00007f230c177000)
        libICE.so.6 => /usr/lib64/libICE.so.6 (0x00007f230bf5b000)
        libX11.so.6 => /usr/lib64/libX11.so.6 (0x00007f230bc1b000)
        libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f230ba0a000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f230b7f4000)
        libgomp.so.1 => /usr/lib64/libgomp.so.1 (0x00007f230b5e6000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f230b3c9000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f230b1c5000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f230e29a000)
        libuuid.so.1 => /lib64/libuuid.so.1 (0x00007f230afc0000)
        libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00007f230ada5000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f230ab9c000)
        libXau.so.6 => /usr/lib64/libXau.so.6 (0x00007f230a999000)
libpng15.so.15 => not found
となっているのでこれが怪しそうです。
いわゆる「ライブラリのパスが通ってない」状態でしょうか。

ln -s /usr/lib/libpng15.so.15 /usr/lib64
としてみたらビンゴ!見事に動きました!

ここだけシムリンク貼るのも気持ち悪いので、
/etc/ld.so.conf.d/libpng.conf というファイルを作って下記行を追記。
/usr/local/lib

反映して確認します。
$ sudo ldconfig && sudo ldconfig -v | grep png
        libpng15.so.15 -> libpng15.so.15.13.0
        libpng.so.3 -> libpng.so.3.49.0
        libpng12.so.0 -> libpng12.so.0.49.0
やった!!
これで、さっきのシムリンクなしでも動きました!

参考

カテゴリ:

人気記事