zlib-1.2.7をMinGWでビルドする

Windows上でzlibが必要になった。libpngを使おうとしたら依存関係の都合でzlibも欲しくなったのだ。

zlibのバイナリは例えばZlib for Windowsなどで入手できるものの、微妙に古い。そこで最新版だと思われるzlib-1.2.7をMinGW*1でビルドすることにした。

ソースコードhttp://zlib.net/から入手。取得したzlib-1.2.7.tar.bz2を伸張・展開するとzlib-1.2.7というディレクトリができるので、コマンドプロンプトでその中に入る。

単純にビルドするだけなら以下でOK。

make -f win32\Makefile.gcc all

今回は高速化の為にアセンブラコードcontrib/asm686/match.Sを使い、且つ若干の最適化オプションを追加してビルドする。match.Sを使うとPentiumより前のCPUでは動作しなくなる。やり方は猫科研究所の記事を参考にした。

copy contrib\asm686\match.S .
make -f win32\Makefile.gcc all LOC="-DASMV -s -mms-bitfields -march=i686" OBJA=match.o

注意点として、match.Sはライセンスがzlib LicenseではなくGPLだ。

試してはないけど、64bit環境用にビルドする場合はcontrib/amd64/amd64-match.Sが使えるようだ。こちらはBSDライセンスとなっている。

ビルドしたzlibは汎用に使う訳ではないので、今回はmake installは行わずに手動で必要なファイルをコピーする。対象となるファイルは以下の通り:

  • libz.a
  • libz.dll.a
  • zconf.h
  • zlib.h
  • zlib1.dll

静的リンクする場合はlibz.a、DLLを使う場合はlibz.dll.aを使うことになる。同じディレクトリに置いておくとリンク時にlibz.dll.aが優先されるようなので、静的リンクしたい場合はlibz.dll.aを改名するか別のディレクトリに置くことになる。

*1:正確にはTDM-GCC 4.5.1だけど。