Subscribed unsubscribe Subscribe Subscribe

sci

最果て風呂

ImageMagick をビルドする

ライブラリの依存関係を疑う

ビルドはできているのに PNG ファイルを扱うとエラーになってしまうことの調査。ImageMagick-6.9.1 までは必須でなかった pkg-config は、6.9.2 からは必要になってしまった。自分の場合、これをインストールしてから問題が生じているので、当初はこれが原因なのではないかと思っていた。

そこで、otoolconvert がどのライブラリを使っているのか調べてみることにした。簡単に png に関係する部分の差分だけ以下にあげる。

6.9.1
/opt/X11/lib/libpng15.15.dylib (compatibility version 34.0.0, current version 34.0.0)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)

6.9.2
/usr/local/lib/libpng16.16.dylib (compatibility version 35.0.0, current version 35.0.0)
/usr/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8)

6.9.1 の時は pkg-config をインストールしていなかったので、/opt/X11/lib, /usr/lib を見ていたんだね。pkg-config を使うと自分がビルドしたものを見てくれている。XQuartz は昔 Gimp で必要だったから入れた、ような気がする……。

実在しているライブラリをそれぞれ見ているのだからここまでは良い。何でエラーになるのだろう?試しに下記を実行してみる。

otool -L /usr/local/lib/libpng16.16.dylib 
/usr/local/lib/libpng16.16.dylib:
    /usr/local/lib/libpng16.16.dylib (compatibility version 35.0.0, current version 35.0.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    ...

convert/usr/local/lib/libz.1.dylib を見ているのに、libpng16 の方は /usr/lib/libz.1.dylib を見ている。これが原因なのだろうか?/usr/local/lib/libz.dylib を見させるにはどうしたら良いのだろう?

libpng のソースディレクトリ scripts/makefile.darwin を見てみると、

# Where the zlib library and include files are located
ZLIBLIB=/usr/lib
ZLIBINC=/usr/include

なんて書いてある。そこで、

make -f scripts/makefile.darwin CC=clang ZLIBLIB=/usr/local/lib ZLIBINC=/usr/local/include

でビルドし直してインストールし、さらに ImageMagick の方もビルドし直してみた。ビルドの途中で

clang: error: no such file or directory: '/usr/local/lib/libpng16.dylib'

というエラーが出てしまったので確認してみると、libpng16.dylib@ -> libpng16.16..dylib という変なリンクになっていた。これを

sudo rm libpng16.dylib 
sudo ln -s libpng16.16.dylib libpng16.dylib 

で修正してやるとビルドが完了した。早速インストールして実験。

う〜ん、それでもやっぱりこのエラーが出ちゃうなぁ……。

convert a.png a.jpg
convert: memory allocation failed `a.png' @ error/png.c/ReadOnePNGImage/2109.
convert: no images defined `a.jpg' @ error/convert.c/ConvertImageCommand/3230.

無駄な作業をしていた

結局、下記のオプションでまともな convert コマンドを生成することができた。

./configure --without-x CC=clang

今までの作業は無駄だったのか?今回もまた何が原因で、何が解決方法なのかわからないままだ……。

自分で理解できないんじゃ、ソースからビルドするのではなく、公式で用意してくれているバイナリをインストールするのがいいのかな。

追記

--without-x オプションを付けないでビルドして、make test の結果である test-suite.log を見てみると、

validate: Application built with libpng-1.5.18 but running with 1.6.18 `' @ warning/png.c/MagickPNGWarningHandler/1656.
validate: memory allocation failed `' @ error/png.c/WriteOnePNGImage/9284.

と書かれていて、やっぱりバージョン関係がおかしい。

で、/opt/X11 の中をぐるぐるまわり、/opt/X11/bin/libpng-config の中身を見ると version="1.5.18" となっていた。つまり X11 内のとあるライブラリは libpng-1.5.18 をリンクしているので、--with-x だとこれらも使うようになるので整合性がつかないと。原因はなんとなく解決したね。

XQuartz は 2.7.7 なのだけれど、これはパッケージ物をインストールしているので、各種ライブラリをアップデートできない。自分は jpg, png, tiff の変換・拡大縮小・結合・トリミングができれば良いので、--without-x のままでいこう。