7.23.2008

coLinux + Debian + MinGW + SDL のクロスコンパイル環境で、SDL_imageを使う。

相変わらず資料が少ないこの問題に取り組んでいる。
普通の人のやらないことっておもしろいじゃない?

んで、今日はSDLに機能拡張を施すSDL_imageやらSDL_mixerやらSDL_ttfやらを扱うにはどうしたらいいか?
という問題。

で、とりあえず今日取り組んだのはSDL_imageを使う方法。
公式サイトにはMinGW向けアーカイブがない。
となるとソースからコンパイルするべきか…?

とも考えてしまいがちだけど、レッスンサイト曰くVC8向けのもので良いらしい。

で、VC8向けのdevelパッケージをとってきたらunzipする。
古いMinGW向け情報だと、ここで*.libを*.aに変換するなんて話題が出てくるけど、この件に関して言えば、それは無視してOK。

unzipした中から、include/以下をいつものSDLのインクルードファイルが置いてあるディレクトリに、lib/以下の*.libファイルを、いつものSDLのライブラリファイルが置いてあるディレクトリに配置する。

で、lib/ディレクトリ以下にある*.dllファイルは、Windowsに送っておく。
(レッスンサイトにもあるけど、これらのDLLは、プログラム本体の配布時に一緒に配布しないといけない。さらに予断だけど、libpngとかzlibなんてのは、配布ライセンスが自前のプログラムと異なったりするから、zlibやlibpng(それだけに限らないだろうけど)のライセンスは、ゲーム本体と違いますよ!ってのを明記するべきだと思う。)

ここまで出来たら、プログラムを書く。とはいっても、Load_BMP関数をIMG_Load関数に置き換えるだけ。
前者がBMP専用なのに対して、後者が汎用だと思えばいい。
そうそう、読み込むファイル名の調整も忘れないように。
(違いを理解するために、PNGファイルを別に用意したほうがいいかも。)

(私のようにものぐさで)Lesson2のプログラムを流用しているならば、またもや2秒間、指定した画像を擁したウィンドウが表示されるはず。



但し、ここでまたもや注意があって、それはコンパイルオプションをきちんと指定しないといけないということ。
これまでの段階で、SDLのコンパイルコマンドをスクリプトに直している人なら、(スクリプトファイル名をsdlcppとした場合)
$ sdlcpp [filename] -lSDL_image
ではダメで、sdlcppの中身を直接いじって、
mingw-cpp $1 -lmingw32 -lSDLmain -lSDL -lSDL_image -mwindows
のようにしなければいけないということ。
(SDL_imageぐらいなら毎回使うから、こうしてスクリプトを修正してもいいかもしれないが、ほかのライブラリの場合には、状況によって考える必要があるかも。)

さて、もしもこの手順を守らないでコンパイルするとどうなるか?
それは、_IMG_Loadへの参照が見つからないという旨のエラーになった。(少なくとも我が家では)

(実は、これにつまづいて、ここに到達するまでに非常に時間がかかった。*.libは使えないんじゃないかとか、*.aに変換する必要があるのかとか、そんな無駄な考えを起こしてしまった。reimpがdebianのaptで入れた一連のmingw32関連パッケージには含まれておらず、急遽windows側でgnu-utilsとmingw32-utilsを取り寄せて、ライブラリを変換できるように頑張ってみたりとか。でも、結局それはいらない作業だったってことがわかった。なぜならVC8用として配布されているlibパッケージも、そのままリンクすることができるんだもの。)

0 件のコメント: