VC++11 と ZlibのMinizip で不具合
不具合というか自分に不都合が。
久しぶりにC++でお仕事していたのですが、以前作ったMinizipライブラリ(Zlibのラッパー)を使ったZip/UnZip処理が、VS2012のVC++11でまともに動かない、又はリンクエラーになってしまい悩んだ。VS2010のVC++10で試したら問題なく動きました。
Zlib
http://www.zlib.net/
Minizip
http://www.winimage.com/zLibDll/minizip.html
-
- まず、MinizipはZlibのcontribフォルダに入っているのですが、Minizipの公式サイトのよりもcontribの方が新しい。というかMinizipの公式サイトの方はtypo修正があったりと同期が取れていない。
- あとVC++のUNICODEビルド設定に対応してるのかしていないのか良く判らない。UNICODE設定では上手く動作しない。
- Zlib v1.2.8でWindows RTのAPI対応が入ったけどバグっていて、VC++11でビルドすると必ず CreateFile2 function | Microsoft Docs を使う実装になってしまい、Windows8以降でしか実行できないバイナリが出来る。
- Zlibのcontrib/vstudio/フォルダのVisualStudioのプロジェクトファイルにおいて、リンク設定で「マニフェストファイルを作成しない」に設定されている為、出来上がったDLLを使ってアプリケーションを起動すると「C ランタイム エラー R6034」が発生する。
- http://msdn.microsoft.com/ja-jp/library/ms235560.aspx
- プロジェクト設定を変更するのが一番手っ取り早い。
- 最初に、Zlib/Minizipを自前でプロジェクトファイルを作成してビルドして動かしたら、作成されたZIP書庫のサイズが倍になっておかしい。
- 原因が分からないので、公式サイトで配布されているバイナリを使ったらそもそもリンクが通らない。
色々調べてみたけど、VS2012が特殊なのかなー。VS2010でもおかしいって情報もあるけど。
VC++10で作ったプロジェクトをVC++11で開いて、コンパイラをVC++11に設定して動かす分には問題なく動作した。VC++11固有の設定項目が悪さしている可能性がある。
- 解決
- zlib 1.2.5 – fatal error LNK1120: X unresolved externals – WishMesh
- プリプロセッサに「ZLIB_WINAPI」を入れたら公式サイトで配布されているバイナリを使った場合のリンクエラーは解消した。
- 自分でビルドしたバイナリの挙動がおかしいのは未解決。
- zlib 1.2.5 – fatal error LNK1120: X unresolved externals – WishMesh
- その他
- MemoryMappedFileでメモリ上に展開したZIP書庫を操作できないかなーって思ったら、出来そうなの見つけた。これは使えました。