ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

PerlMagick (Image::Magick) のインストール (Debian squeeze + perlbrew 環境)

ImageMagickPerl 用インターフェイスである PerlMagick (Image::Magick モジュール) のインストールがなかなかうまくいかなかったので、メモしておきます。

環境

  • Debian squeeze (6.0.4)
  • Perl 5.8.8 (Perlbrew 0.42 でインストール)

背景

最初は apt-get で ImageMagick 関連の必要そうなパッケージをインストールして、cpanm で PerlMagick (Image::Magick) をインストールしようかとしました。

$ cpanm Image::Magick

しかしなぜかうまく行かず。 Web 上を調べると同様のことをしようとして失敗している人が結構居て、PerlMagick の Makefile.PL を書き換えて ImageMagick のライブラリや include のパスを追加すればいい、というような情報もありましたが、そういうことをやってみても成功しませんでした。 PerlMagick のバージョンは ImageMagick に合わせないとダメらしいので、cpanm でインストールする PerlMagick のバージョンを指定したりもしましたが結局だめでした。

エラーメッセージを見ても何がダメなのかよくわからない、という状態。

しょうがないのでソースからインストール

多分何か足りないものがあるんだと思いますが、何が足りないのかよくわかんないので ImageMagick と PerlMagick の両方ともソースからビルドすることにしました。

ImageMagick のインストール

公式のインストールガイドは下記ページ。

最新の ImageMagick 6.7.6-5 をインストールしました。 インストールガイドに従えば特に問題なくインストールできると思います。

なお、apt-get でインストールされた ImageMagick 関連のライブラリとソースからビルドしてインストールしたものは共存できるはずですが、ややこしいので apt-get でインストールされた方はあらかじめアンインストールしておきました。

PerlMagick のインストール

公式のインストールガイドは下記ページ、またはソースディレクトリ内の README.txt を読むといいでしょう。

まず、ImageMagick のバージョンに合わせた PerlMagick (例えば ImageMagick 6.7.6 に対しては PerlMagick 6.76) のソースコードをダウンロードして、展開します。 今回の場合は、PerlMagick 6.76 をダウンロードしました。

次に、展開後の PerlMagick のディレクトリに移動して Makefile.PL のパスのところに、自分の環境に合わせた MagickCore ライブラリへのパス情報を追加 します。 インストールガイドだとそれだけでいいはずなのですが、Makefile.PL を見ると、ビルドオプションとして "-lperl" というのがついていて、libperl も必要とされている様子があります。 実際のところ libperl が必要なのかどうか疑問ですが、libperl へのパスも追加することにします。 うちの環境だと、

に libperl がありますので、

をパスに追加しました。

後はガイドどおりに下記コマンドを実行することでインストール完了です。

$ perl Makefile.PL
$ make
$ make install

ただし、perl のインストール時に ccflags として -fPIC を指定していないと以下のようなエラーが出てしまうと思います。

$ make
Skip blib/lib/Image/Magick.pm (unchanged)
cc -c  -I/usr/local/include/ImageMagick -I../ -I.. -pthread -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -pthread -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/graphviz -I/usr/include/freetype2 -I/usr/include/libxml2 -I"/usr/include/ImageMagick" -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fopenmp -g -O2 -Wall -pthread -O2   -DVERSION=\"6.76\" -DXS_VERSION=\"6.76\" -fpic "-I/home/nobuoka/perl5/perlbrew/perls/perl-5.8.8/lib/5.8.8/x86_64-linux/CORE"  -D_LARGE_FILES=1 -DHAVE_CONFIG_H Magick.c
Running Mkbootstrap for Image::Magick ()
chmod 644 Magick.bs
rm -f blib/arch/auto/Image/Magick/Magick.so
LD_RUN_PATH="/usr/local/lib" cc  -L/usr/local/lib -lMagickCore -L../magick/.libs -lMagickCore -shared -L/usr/local/lib -L/usr/lib Magick.o  -o blib/arch/auto/Image/Magick/Magick.so 	\
	   -L/usr/local/lib -L/home/nobuoka/perl5/perlbrew/perls/perl-5.8.8/lib/5.8.8/x86_64-linux/CORE -lMagickCore -lMagickCore -lperl -lm  	\
	  
/usr/bin/ld: /home/nobuoka/perl5/perlbrew/perls/perl-5.8.8/lib/5.8.8/x86_64-linux/CORE/libperl.a(perl.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/home/nobuoka/perl5/perlbrew/perls/perl-5.8.8/lib/5.8.8/x86_64-linux/CORE/libperl.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [blib/arch/auto/Image/Magick/Magick.so] エラー 1

その場合は、以下のように -fPIC オプションを指定して Perl をビルドすれば良いようです。

$ perlbrew install perl-5.8.8 -A ccflags=-fPIC

libperl っているのだろうか

結局のところ PerlMagick に libperl っているんですかね。 なくても問題ないような気がします。