zlibの使い方についてメモ 環境は Visual Studio 2010 Professional とする。 ダウンロード ここをクリックすると zlib-1.2.3-src.exe が勝手にダウンロードされる。 zlib-1.2.3-src.exe を起動し、インストールする。 デフォルトでインストールした場合は C:\Program Files (x86)\GnuWin32\src\zlib\1.2.3\zlib-1.2.3 以下のフォルダに必要なファイルが保存される。 zlib-1.2.3 を必要なところにコピー(移動)する。 ソリューションファイル・プロジェクトファイルを開く zlib-1.2.3\win32\VisualC.txt にはプロジェクトの場所が記述してある。 zlib-1.2.3\projects\visualc6\zlib.dsw がソリューションファイル。 同フォルダにプロジェクトファイル zlib.dsp と minigzip.dsp と example.dsp の3つがある。 それら全4つのファイルはVisualStudio 6.0の古い形式なので開くと自動的に変換される。 構成マネージャはDebugかRelease、ダイナミックリンクかスタティックリンク、ASMかで計8通りのビルド方法がある。 このうち、ASMはビルドができないようだ。 以下デフォルトのDebug(スタティックリンク、ASMなし)として解説する。 zlibプロジェクトのビルド (VSソリューションを開き、下位フォルダに zlib-1.2.3 があるものとして) ソリューションを右クリック>[追加]>[既存のプロジェクト]で zlib.dsp を追加する。(プロジェクトファイルは自動変換) この状態でプロジェクトを右クリックしてビルドすると、fatal error C1083: include ファイルを開けません。'unistd.h': No such file or directory エラーが出る。 エラーをダブルクリックし、2行上(287行目)の #if 1 /* HAVE_UNISTD_H -- this line is updated by ./configure */ の行の 1 を 0 にして、 #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ と書き換えてビルドすると、ビルドが成功する。 ビルドが成功するとDebug ビルドなら、zlib-1.2.3\projects\visualc6\Win32_LIB_Debug フォルダ内に zlibd.lib というスタティックリンクライブラリが作成される。 example プロジェクトと minigzip プロジェクトのビルド 「zlibプロジェクトのビルド」の続きとする。 minigzip.dsp と example.dsp をプロジェクトに追加する。 それぞれ、プロジェクトを右クリック>[構成プロパティ]>[リンカー]>[全般]>[追加のライブラリ ディレクトリ]に zlib-1.2.3\projects\visualc6\Win32_LIB_Debug フォルダをフルパスで追加する。 プロジェクトを右クリック>[構成プロパティ]>[リンカー]>[入力]>[追加の依存ファイル]に zlibプロジェクトのビルドで作成された zlibd.lib を追加する。 [構成プロパティ]>[VC++ ディレクトリ]>[インクルード ディレクトリ]に zlib-1.2.3 フォルダをフルパスで追加する。 プロジェクトを右クリック>[プロジェクト依存関係]で zlib にチェックする。 これで両方共ビルドできるようになり、zlib-1.2.3\projects\visualc6\Win32_LIB_Debug に出力される。 minigzip.exe にはファイル・フォルダをドラッグすると gz 形式で圧縮される。 zlib のcompress()、uncompress()の使い方 必要なヘッダファイルは zlib.h と zconf.h(287行目 1を0にしたもの) なので準備する。 インクルードに必要なのは zlib.h。 ライブラリファイルはデフォルトで zlib をビルドした zlibd.lib とする。 zlibd.lib を必要なプロジェクトで可視にする([構成プロパティ]>[リンカー]>[入力]>[追加の依存ファイル]を編集など)。 圧縮したい時は compress() を使う。 //戻り値:Z_OKなら成功。ZM_MEM_ERRORはメモリ不足、Z_BUFF_ERRORは出力バッファのサイズ不足エラー。 int compress(unsigned char *dest, // 出力:圧縮データを書き込むための、予め確保されたメモリ unsigned long *destLen, // 入出力:dest で確保済みのサイズを入力し、書き込んだサイズを出力 const unsigned char *source, // 入力:圧縮するデータ unsigned long sourceLen // 入力:圧縮するデータのサイズ ); compress2()は圧縮レベルを最後の引数で1~9の範囲で指定できる。9が最も圧縮できるが低速。 元に戻すには uncompress() を使う。 //戻り値:Z_OKなら成功。ZM_MEM_ERRORはメモリ不足、Z_BUFF_ERRORは出力バッファのサイズ不足エラー。 int uncompress(unsigned char *dest, // 出力:復号データを書き込むための、予め確保されたメモリ unsigned long *destLen, // 入出力:dest で確保済みのサイズを入力し、書き込んだサイズを出力 const unsigned char *source, // 入力:復号するデータ unsigned long sourceLen // 入力:復号するデータのサイズ ); サンプルコード zlib のcompress()、uncompress()のサンプルコード
リンク |
memo >