人気ブログランキング | 話題のタグを見る

[perl] GD モジュールをインストール

Perl 5.8.5 で なんとしても GD モジュールが動かない件。
ずっーと前なんだけど、これだけで数週間ハマった。
他にも悩んでいる人がいかもしれないのと思うんで、メモっとくよ。

環境とか


マシンは RedHat Enterprise Linux ES v 4.0。
以下のライブラリは入れてある。
($ rpm -qa | grep gd-level のように検索する)
  gd-2.0.28-4
  gd-devel-2.0.28-4
  libpng10-1.0.16-1
  libpng-devel-1.2.7-1
  libpng-1.2.7-1
  libjpeg-6b-33
  libjpeg-devel-6b-33

GD モジュールは、libgd や libjpeg のバージョンに制限があるのだが、
これならそれも問題なくクリアしている。

インストールしても動かない


さて、perl モジュール GD のインストール。
Lincoln D. Stein / GD - search.cpan.org
現在のところ、最新版は GD-2.35.tar.gz である。

解凍して make。
$ tar xvzf GD-2.35.tar.gz
$ cd GD-2.35


ライブラリを漏れがないように全て指定するために、
以下のようなファイルを作って実行。
$ more my_make
perl Makefile.PL ¥
    -options "JPEG,PNG,GIF" ¥
    -lib_gd_path /usr/lib ¥
    -lib_png_path /usr/lib ¥
    -lib_jpeg_path /usr/lib


上記ファイルを実行した後、make。
$ bash my_make
Included Features:     JPEG,PNG,GIF
GD library used from:   /usr/lib
PNG library used from:   /usr/lib
JPEG library used from:  /usr/lib

If you experience compile problems, please check the @INC, @LIBPATH and @LIBS
arrays defined in Makefile.PL and manually adjust, if necessary.

Checking if your kit is complete...
Looks good
Writing Makefile for GD

$ make


詳細にログを出しながら、ちゃんとインストールされたかをテストする。
$ make test TEST_VERBOSE=1
(中略)
ok 7
ok 8 # Skip, FreeType changes too frequently to be testable
ok 9 # Skip, no XPM support
ok 10 # Skip, no JPEG support
ok 11
ok 12
ok
    3/12 skipped: various reasons
t/Polyline....1..1
(省略)


no JPEG support って、libjpeg がリンクされてないのか!?
ガーンΣ(゜ロ゜〃)

数日間の試行錯誤


libgd 、libjpeg、libpng は勿論のこと、色々入れ直しましたよ。
ソースから入れてみたり、rpm 使ってみたり。

ソースから入れると、
***-devel-*** なんてのの場合は、/usr/local/bin にファイルができたりする。
普通は、RH は /usr/bin くらいしか使わないので、
ゴミがたまっちゃったかーと思って、削除したら、
  rm /usr/local/bin
のつもりが
  rm /usr/bin
だったりして、アヒャヒャヒャヽ(゜∀゜)ノなことに。
man は見られないは、iconv は消えるは、
less も more も vi もねぇよ、という、
シンプルにもほどがある環境になってしまい、大慌てで復旧。

CD から再インストールってテはあるけどさ、
実は他の部署のマシンで、その部署のマシンルームにあるから、
タダでさえマシンルームは許可がないと入れないのに、
他部署の私は、特に入るのが大変なわけ。
だから、マシンに CD を入れて再インストール、というのは無理。
仕方ないから、自分の端末からしこしこ rpm を ftp して入れましたよ。
sftp と ssh が無事だったのが幸いでした。
もう泣きそうですよ。
自分が悪いんだけど。

こういうのって、何年かに一度くらいやるんだよねー。
数年前も、/usr/local/lib 丸ごと削除、ってやったしなぁ。
そのマシンは Solaris でさ、
Linux は大概のアプリは /usr/lib に入っていると思うけど、
Solaris って、よく使うアプリでも /usr/local/lib にあるのよ。
もうディスクマウントは外れるは、
ログインできないは、ぷち臨死体験でしたよ。
自分が悪いんだけど。

解決


元に戻って、perl の GD モジュールの件。
ふと GD モジュールのバージョンを下げてみよう、と思い立った。
実は以前 RHEL ES v3.0 で GD モジュールを使ったことがあって、
その時にインストールに使った tar-ball が自マシンに残っていた。
GD-2.32である。
perl のモジュールだから、
libc や kernel のバージョンはうるさく言わないだろうと思い、
前述の方法と同様にインストールしてみた。

$ tar xvzf GD-2.32.tar.gz
$ cd GD-2.32
$ more my_make
perl Makefile.PL ¥
    -options "JPEG,PNG,GIF" ¥
    -lib_gd_path /usr/lib ¥
    -lib_png_path /usr/lib ¥
    -lib_jpeg_path /usr/lib
$ bash my_make
$ make


いよいよテスト。
$ make test TEST_VERBOSE=1
(中略)
ok 7
ok 8 # Skip, FreeType changes too frequently to be testable
ok 9 # Skip, no XPM support
ok 10
ok 11
ok 12
ok
(省略)


ぶらぼー!
no JPEG support が出なくなった!

以下のようなテストファイルでも試してみる。
$ more gd-test.pl
#!/usr/bin/perl
use GD ;
print 'GD::VERSION is ', $GD::VERSION, "\n";
print map {
 $_, '=', (GD::Image->can('newFrom'.$_)) ? 'OK' : 'NG' ,"\n" ;
} ('Png', 'Jpeg', 'Gif') ;

$ perl -w gd-test.pl
GD::VERSION is 2.32
png=OK
jpeg=OK
gif=OK
$


こちらもぶらぼー!
これでめでたく使える!

まとめ


というわけで、まとめてみると、
以下のセットで使え!ということだ。

  RedHat Enterprise Linux ES v4.0
  Perl 5.8.5
  gd-2.0.28-4
  gd-devel-2.0.28-4
  libpng-devel-1.2.7-1
  libpng-1.2.7-1
  libjpeg-6b-33
  libjpeg-devel-6b-33

×GD-2.35.tar.gz ... 動かない!
○GD-2.32.tar.gz

Can't locate object method "png" via package "GD::Image"
もしくは
Can't locate object method "jpeg" via package "GD::Image"
という文言で検索して来た方は、
以下の3点を再確認すること。

(1) 各種ライブラリがインストールされているか
→ gd のほかに、gd-devel が必要なのかも。
  libjpeg などについても、
  それぞれ対応する libjpeg-devel などが必要っぽい。

(2) 各種ライブラリ(libxxx)のバージョンが合っているか
→ バージョンが古いとダメ。

(3) GD インストール時にライブラリのパスを明示的にperlに教えてみる
→ Makefile を確認すればわかることだけど、
  Makefile が読めない人は、きちんと引数で指定すべし。

ネットでヒントを探し回ったのだが、
大体上記3つの項目で抜けがある人が多い。
それでもダメなら、私と同じ現象かもしれないので、
GD モジュールのバージョンを下げてみましょう。
どれが stable なのかわからないけど、
とりあえず、GD-2.32 が動いたことは保証できる。

ちなみに、/usr/lib の一部はこんな感じ。
$ /bin/ls -Al libgd.* libjpeg* libpng*
-rw-r--r-- 1 root root 255120 11月 4 2004 libgd.a
lrwxrwxrwx 1 root root   14 1月 9 18:25 libgd.so -> libgd.so.2.0.0
lrwxrwxrwx 1 root root   14 1月 9 18:25 libgd.so.2 -> libgd.so.2.0.0
-rwxr-xr-x 1 root root 228052 11月 4 2004 libgd.so.2.0.0
-rw-r--r-- 1 root root 156828 10月 7 2004 libjpeg.a
-rwxr-xr-x 1 root root  470 10月 7 2004 libjpeg.la
lrwxrwxrwx 1 root root   17 1月 9 18:25 libjpeg.so -> libjpeg.so.62.0.0
lrwxrwxrwx 1 root root   17 1月 9 18:25 libjpeg.so.62 -> libjpeg.so.62.0.0
-rwxr-xr-x 1 root root 117976 10月 7 2004 libjpeg.so.62.0.0
lrwxrwxrwx 1 root root   10 1月 9 18:25 libpng.a -> libpng12.a
lrwxrwxrwx 1 root root   11 1月 9 18:25 libpng.so -> libpng.so.3
lrwxrwxrwx 1 root root   18 12月 5 15:11 libpng.so.2 -> libpng.so.2.1.0.16
-rwxr-xr-x 1 root root 142648 8月 17 2004 libpng.so.2.1.0.16
lrwxrwxrwx 1 root root   17 1月 9 18:25 libpng.so.3 -> libpng.so.3.1.2.7
lrwxrwxrwx 1 root root   19 12月 22 15:37 libpng.so.3.1.2.2 -> libpng12.so.0.1.2.2
lrwxrwxrwx 1 root root   19 1月 9 18:25 libpng.so.3.1.2.7 -> libpng12.so.0.1.2.7
-rw-r--r-- 1 root root 169800 9月 15 2004 libpng12.a
lrwxrwxrwx 1 root root   13 1月 9 18:25 libpng12.so -> libpng12.so.0
lrwxrwxrwx 1 root root   19 1月 9 18:25 libpng12.so.0 -> libpng12.so.0.1.2.7
-rwxr-xr-x 1 root root 226481 12月 22 15:37 libpng12.so.0.1.2.2
-rwxr-xr-x 1 root root 142648 9月 15 2004 libpng12.so.0.1.2.7


だがしかし


RedHat Linux 9( kernel 2.4.20、gcc3.2 ) なら GD-2.35 でも動くらしい。
perl の version が 5.8.0 だから?
でも 5.8.0 はあんまし stable じゃないので、使うのイヤなんだけど。
多言語まわりもまだおかしいし。
by xiaoxia | 2007-09-26 22:26 | プログラム言語
<< [perl] DBI のデストラクタ [lisp] emacsのto... >>