ぼく用あれこれまとめ
zlib 1.2.7 を Visual Studio 2012 Express でビルドする
最終更新:
bokuyo
-
view
zlib 1.2.7 を Visual Studio 2012 Express でビルドする
- zlib 1.2.7(May 2, 2012) を Windows 7 環境にて導入します。
- Visual Studio 2012 Express for Windows Desktop を使用しています。実行したのは 32bit(x86) 環境です。
- 適宜、お使いの環境に合わせて読み進めてください
- Visual C++ 2012 コンパイラを使います
- Visual C++ 2012 コンパイラより以前の VC++ 10 環境(Visual Studio 2010)および VC++ 11 Beta コンパイラ(Visual Studio 2012 RC) と混同しないよう注意してください。
- zlib 1.2.7 を Visual Studio 2012 RC でビルドする - VC++ 11 Beta コンパイラ(Visual Studio 2012 RC)
- zlib 1.2.6 をVisual C++でビルドする - Visual Studio 2010 (VC++ 10)
ダウンロード
- http://zlib.net/(公式サイト)から「zlib source code, version 1.2.7, zipfile format」をダウンロードします。
- ダウンロードした"zlib127.zip" ファイルを解凍します。
- 以降の説明では、面倒なので解凍先を C ドライブにしています
Visual Studio 2012 用のソリューション・プロジェクトファイルを作る
- "zlib-1.2.7/contrib/vstudio/vc10/" フォルダをコピーして、新たに作業用の "zlib-1.2.7/contrib/vstudio/vc11/" フォルダを作ります。
- "zlib-1.2.7/contrib/vstudio/vc11/zlibvc.sln" をVisual Studio 2012 Express で開きます
- 次のポップアップウィンドウが出たら「更新する(U)」を選択してください
VC++ コンパイラとライブラリを更新します このソリューションには、以前のバージョンの VC++ コンパイラとライブラリを使用するプロ ジェクトが 1 つ以上含まれています。各プロジェクトを Visual C++ 2012 コン パイラとライブラリを使用するように更新できます。
- これで Visual C++ 2012 コンパイラを使用できます。
Visual Studio 2012 Express でビルドする
- そのままビルド(F7)してください。
ビルド時のエラー (1) - def ファイルで LNK1118
1>.\zlibvc.def(4): fatal error LNK1118: 'VERSION' ステートメントに構文エラーがあります。
解決策
- "zlib-1.2.7/contrib/vstudio/vc11/zlibvc.def" を開くと 4 行目が次のようになっている
VERSION 1.2.7
- VERSION がとる引数は major[.minor] なのでこれを次のように修正
VERSION 1.27 //ok
ビルド時のエラー (2) - SAFESEH イメージには安全ではありません
2>match686.obj : error LNK2026: モジュールは SAFESEH イメージには安全ではありません。 2>inffas32.obj : error LNK2026: モジュールは SAFESEH イメージには安全ではありません。 2>adler32.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 2>x86\TestZlibDebug\testzlib.exe : fatal error LNK1281: SAFESEH イメージを生成できません。 1>match686.obj : error LNK2026: モジュールは SAFESEH イメージには安全ではありません。 1>inffas32.obj : error LNK2026: モジュールは SAFESEH イメージには安全ではありません。 1>adler32.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 1>x86\ZlibDllDebug\zlibwapi.dll : fatal error LNK1281: SAFESEH イメージを生成できません。 3>testzlib.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 4>minizip.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 5>miniunz.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。
解決策 - /SAFESEH を特に指定しないようにする(/SAFESEH:NO にするわけではない)
- zlib 1.2.7 の Visual Studio 2010 用のソリューションファイル (.sln) を Visual Studio 2012 Express 用に変更すると、リンカーオプションに /SAFESEH が勝手に追加されます
- Visual Studio 2010 用のソリューション・プロジェクトファイルを見る限り、/SAFESEH オプションは何も指定されていません
- リンカ―の詳細設定から /SAFESEH に関する指定を外してあげます
- ソリューションエクスプローラから "zlibvc" プロジェクトを選択
- プロジェクト -> プロパティ -> 構成プロパティ -> リンカ― -> 詳細設定 -> "安全な例外ハンドラーを含むイメージ"
- 「はい (/SAFESEH)」または「いいえ (/SAFESEH:NO)」が指定されている場合、項目を削除して何も指定しないようにします。(backspace キーか delete キーで指定されている文字「はい (/SAFESEH)」または「いいえ (/SAFESEH:NO)」を消しちゃってください)
- zlibvc プロジェクトと同様に、miniunz, minizip, testzlib, testzlibdll プロジェクトの /SAFESEH に関する指定を外します
- "ビルド" -> "ソリューションのクリーン" でソリューション全体を一度クリーンします
- ビルドします
- Release(または Debug)でビルドするときに /SAFESEH に関する指定を外すのを忘れないように。
実際に使ってみる
スタティックライブラリのリンク:
#if ( _MSC_VER >= 1700 ) # if defined( _DEBUG ) # pragma comment(lib, "ZlibStatDebug/zlibstat.lib") # else # pragma comment(lib, "ZlibStatRelease/zlibstat.lib") # endif #endif
zlib の呼び出し規約を ZLIB_WINAPI に設定して zlib.h をインクルード:
#ifndef ZLIB_WINAPI # define ZLIB_WINAPI #endif #include <zlib/zlib.h>
- ZLIB_WINAPI を設定するかどうかは zlib を使用するアプリケーションごとに適切な呼び出し規約を指定してください。
- 今回のビルド方法では、zlib は MTd/MT でビルドされているので、MDd/MD のアプリケーションで使用すると、CRT ライブラリが競合を起こします。
- 大抵の場合は、アプリケーションのほうを MTd/MT に合わせればおっけーです。