苦闘中
SDL_imageにjpeg、libpng(とlibtiff)を内蔵、SDL_mixerにsmpegとlibogg、libvorbisを内蔵させたものをVC2003で作るべく、何もかもが手探りの作業がスタートした。
SDLのビルド
ソースコードを取得する。中にVisualC.zipがあるので、その場に解凍。SDL.slnはVC2005用なので、SDL.dswをVC2003用に変換して使う。あとはReleaseでビルドするだけ。ダイナミックライブラリSDL.dll、インポートライブラリSDL.lib、SDLmain.libができる。
zlibのビルド
これはVCプロジェクトがあるので簡単。Win32_LIB_Release構成でビルドすればスタティックライブラリzlib.libができる。
jpegのビルド
これはVCのコマンドラインコンパイラを使わなければならないのでまずその設定をする。VCのディレクトリ(自分の場合はC:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin)にあるvcvars32.batを(コマンドプロンプトから)実行して環境変数を設定するだけ。つぎにjconfig.vcをjconfig.hにリネーム。あとはコマンドプロンプトで
nmake /f makefile.vc nodebug=1
をおこなう。libjpeg.libが存在しないエラーが出るのでmakefile.vcの
$(RM) libjpeg.lib
の行をコメントアウトしてもう一回やる。これでスタティックライブラリlibjpeg.libができる。
libpngのビルド
VCプロジェクトがある。zlibに依存するが、すでにプロジェクトに含まれているので何も考えずにLIB Release構成でビルドすれば、スタティックライブラリlibpng.libができる。
libtiffのビルド
コマンドラインなので、まずlibtiffディレクトリ内のtif_config.h.vcとtiffconf.h.vcの.vcを取る。そしてtiffconf.hを開き、
/* #undef JPEG_SUPPORT */ /* #undef PIXARLOG_SUPPORT */ /* #undef ZIP_SUPPORT */
を
#define JPEG_SUPPORT 1 #define PIXARLOG_SUPPORT 1 #define ZIP_SUPPORT 1
に書き換える。次に上のディレクトリ(tiff-3.8.2)に戻り、nmake.optを開き、
#JPEG_SUPPORT = 1 #JPEGDIR = d:/projects/jpeg-6b #JPEG_INCLUDE = -I$(JPEGDIR) #JPEG_LIB = $(JPEGDIR)/Release/jpeg.lib
の先頭の#を消して、以下のようにパスを設定する。
JPEG_SUPPORT = 1 JPEGDIR = (jpeg-6bディレクトリのフルパス) JPEG_INCLUDE = -I$(JPEGDIR) JPEG_LIB = $(JPEGDIR)/libjpeg.lib
同様に、
#ZIP_SUPPORT = 1 #ZLIBDIR = d:/projects/zlib-1.2.1 #ZLIB_INCLUDE = -I$(ZLIBDIR) #ZLIB_LIB = $(ZLIBDIR)/zlib.lib
の先頭の#を消し、以下のようにパスを設定する。
ZIP_SUPPORT = 1 ZLIBDIR = (zlibディレクトリのフルパス) ZLIB_INCLUDE = -I$(ZLIBDIR) ZLIB_LIB = $(ZLIBDIR)/projects/visualc6/Win32_LIB_Release/zlib.lib
あと、
#PIXARLOG_SUPPORT = 1
の先頭の#もはずしておく。そうしたらlibtiffディレクトリに入り、
nmake /f Makefile.vc libtiff.lib
とやれば、スタティックライブラリlibtiff.libができる。
SDL_imageのビルド
いよいよSDL_imageのビルドである。ここでやりたいのは上で作成したzlib.lib、libjpeg.lib、libpng.lib、libtiff.libをSDL_imageにスタティックリンクすることで、ゲームに同梱するDLLをSDL.dll、SDL_image.dllのみにすることである。
しかしここで大きな問題が生じる。SDL_imageはSDLに依存するのでリンクしなければならない。SDLはダイナミックライブラリである。上にあげたライブラリ群はスタティックライブラリである。SDL_imageというひとつのプロジェクトに対し、ダイナミックリンクとスタティックリンクを同時に行ってビルドすることはできるのだろうか?VCのプロジェクトのオプションでランタイムライブラリの項目には「マルチスレッド(/MT)」か「マルチスレッド DLL(/MD)」のどちらかしか指定できない。
実際にやってみる。「SDL.lib libjpeg.lib libpng.lib libtiff.lib zlib.lib」をリンカに指定して、ビルドする。「マルチスレッド(/MT)」でも「マルチスレッド DLL(/MD)」でもビルドは正常終了した。しかし、どちらの場合でもjpg、png、tiffともに読み込めなかった。dllのサイズからみて、明らかにスタティックリンクがされていない。
しかし、この問題を解決できそうなヒントがSDL_mixerの方にある。SDL_mixerはデフォルトでmidiを読み込めるが、ソースを見る限り外部ライブラリを使っているようなのだ。そしてVCプロジェクト上ではそのライブラリはスタティックライブラリとしてビルド、リンクされるようになっている。もちろんSDL_mixerはSDLに依存するのでダイナミックリンクも同時に行うのだから、上の問題は解決可能ということになる(そもそもvorbisを内蔵したSDL_mixerがある時点でそう言えるのだが)。ちなみにSDL_mixerのランタイムライブラリオプションは「マルチスレッド DLL(/MD)」になっている。
というところでいまストップしております。知識ゼロだもんでダレカ教えてください( つд`)
追記
ちょっとわかったこと。
VCプロジェクトオプションのランタイムライブラリとは、「VCの」ランタイムライブラリをどの種類のものを使用するかということで、リンクするプロジェクト間で設定を統一する必要があるだけで、普通のライブラリとは関係ないみたいです。それなら普通のライブラリはダイナミックとスタティックを混在させることは可能っぽいですね。しかしなぜスタティックリンクがされないのはどうしてだぜ・・・。