桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

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」が発生する。
    • 最初に、Zlib/Minizipを自前でプロジェクトファイルを作成してビルドして動かしたら、作成されたZIP書庫のサイズが倍になっておかしい。
    • 原因が分からないので、公式サイトで配布されているバイナリを使ったらそもそもリンクが通らない。

色々調べてみたけど、VS2012が特殊なのかなー。VS2010でもおかしいって情報もあるけど。

VC++10で作ったプロジェクトをVC++11で開いて、コンパイラVC++11に設定して動かす分には問題なく動作した。VC++11固有の設定項目が悪さしている可能性がある。