iRSSの日記

はてなダイアリーiRSSの日記の続き

FreeType2を使うための環境セットアップ

サーバー上で文字を描画するという仕事が来ている。
WindowsのDGIとMacのQuickDrawなら何とかわかるんだけど、今度の案件はUnixサーバー、それもSoralis上。
PHPPerl経由で簡単に済ましてしまおうと思っていたのだけど、細かい制御ができるようなAPIがなかったりした。
しらべてみると、PHPにしても、Perlにしても結局はGD+FreeTypeに行き着く。
図形描画自体はGDでなくても、いくつか選択肢はあるが、TryeTypeFontでの描画の部分は、GDも結局FreeType2を呼び出している。
高品質な描画ライブラリである、Cairoも、TryeTypeFont描画部分はFreeType2だった。

ということで、肝はFreeType2ということになる。GDもCairoもそのラッパーということになる。
さらに、そのGDやCairoをPerl,PHP,Rubyから呼び出すことになる。
もちろん、全部Cで作っちゃえば、Perl,PHP,RubyはなくてもOKである。

その肝のFreeTypeをインストールしている。

初めてのCygwin
初めてのgcc+make
初めてのgunzip+tar
と、まあ、はじめてばかりで苦労しています。
どうなることやら...

Cygwinのデフォルトに追加したライブラリ

Cygwinのsetup.exeから

Devel.gcc
Devel.make
Interpreters.perl


追加したPerlのモジュール

GD.pm

perl Makefile.PL
make
make install
で終わるはずが、makeで失敗しました

hayao:~/pkg/GD-2.11$ perl Makefile.PL

NOTICE: This module requires libgd 2.0.12 or higher.
it will NOT work with earlier versions.
See www.cpan.org for versions of GD that are compatible
with earlier versions of libgd.

If you are using Math::Trig 1.01 or lower, it has a bug that
causes a "prerequisite not found" warning to be issued. You may
safely ignore this warning.

Type perl Makefile.PL -h for command-line option summary

Where is libgd installed? [/usr/lib]

Please choose the features that match how libgd was built:
Build JPEG support? [y]
Build FreeType support? [y]
Build XPM support? [y] n

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

Writing Makefile for GD
hayao:~/pkg/GD-2.11$ make
gcc -c -I/usr/local/include -I/usr/local/include/gd -DPERL_USE_SAFE_PUTENV -fno

  • strict-aliasing -pipe -I/usr/local/include -DUSEIMPORTLIB -O3 -DVERSION=\"2.1

1\" -DXS_VERSION=\"2.11\" "-I/usr/lib/perl5/5.8/cygwin/CORE" -DHAVE_JPEG -DHAV
E_FT GD.c
GD.xs: In function `XS_GD__Image_stringFT':
GD.xs:1868: warning: cast to pointer from integer of different size
Running Mkbootstrap for GD ()
chmod 644 GD.bs
rm -f blib/arch/auto/GD/GD.dll
LD_RUN_PATH="" ld2 -s -L/usr/local/lib GD.o -o blib/arch/auto/GD/GD.dll /usr/
lib/perl5/5.8/cygwin/CORE/libperl.dll.a -L/usr/local/lib -lgd -lpng -lz -lfreety
pe -ljpeg -lm
gcc -shared -o GD.dll -Wl,--out-implib=libGD.dll.a -Wl,--export-all-symbols -Wl
,--enable-auto-import -Wl,--stack,8388608 \

  • s -L/usr/local/lib GD.o /usr/lib/perl5/5.8/cygwin/CORE/libperl.dll.a -L/usr/lo

cal/lib -lgd -lpng -lz -lfreetype -ljpeg -lm
Creating library file: libGD.dll.a
/usr/local/lib/libgd.a(gdkanji.o): In function `do_convert':
/home/hiroki/pkg/gd-2.0.33/gdkanji.c:381: undefined reference to `_libiconv_open
'
/home/hiroki/pkg/gd-2.0.33/gdkanji.c:395: undefined reference to `_libiconv'
/home/hiroki/pkg/gd-2.0.33/gdkanji.c:412: undefined reference to `_libiconv_clos
e'
collect2: ld returned 1 exit status
perlld: *** system() failed to execute
gcc -shared -o GD.dll -Wl,--out-implib=libGD.dll.a -Wl,--export-all-symbols -Wl
,--enable-auto-import -Wl,--stack,8388608 \

  • s -L/usr/local/lib GD.o /usr/lib/perl5/5.8/cygwin/CORE/libperl.dll.a -L/usr/lo

cal/lib -lgd -lpng -lz -lfreetype -ljpeg -lm

make: *** [blib/arch/auto/GD/GD.dll] Error 1
hayao:~/pkg/GD-2.11$

どうやら、libiconvへのパスが通っていないという想像がつくまでに、3時間くらいかかりました。
で、変更箇所ですMakefile.PLの22行目です

変更前   my @LIBS = qw(-lgd -lpng -lz );

変更後   my @LIBS = qw(-lgd -lpng -lz -liconv);

  • liconvを@LIBSについかすればいいんですね。

未だ@LIBSがなんなのかよくわかってないのですが(Perl初心者なんです)これで、とおりました。