ぼく用あれこれまとめ
zlib 1.2.7 を Visual Studio 2012 RC でビルドする
最終更新:
bokuyo
-
view
zlib 1.2.7 を Visual Studio 2012 RC でビルドする
- zlib 1.2.7(May 2, 2012) を Windows 7 環境にて導入します。
- Visual Studio 2012 RC を使用しています。32bit(x86) 環境です。
- 適宜、お使いの環境に合わせて読み解いてください
- VC++ 11 Beta コンパイラを使うので、それまでの VC++ 10 環境(Visual Studio 2010)と混同しないよう注意してください。
- Visual Studio 2012 Express (Visual C++ 2012 コンパイラ)を使用する場合は以下のページを参照してください
ダウンロード
- 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 RC で開きます
- 次のポップアップが出たら「更新する(U)」を選択してください
VC++ コンパイラとライブラリを更新します このソリューションには、以前のバージョンの VC++ コンパイラとライブラリを使用するプロ ジェクトが 1 つ以上含まれています。各プロジェクトを VC++ 11 Beta コンパイラとライ ブラリ (v110) を使用するように更新できます。
- これで VC++ 11 Beta コンパイラを使用できます。
Visual Studio 2012 RC でビルドする
- そのままビルド(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 イメージを生成できません。 4>minizip.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 3>testzlib.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 5>miniunz.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。
解決策 (1) - ビルドイベントでアセンブルされる inffas32.obj と match686.obj を /SAFESEH オプションでアセンブルする
- "zlib-1.2.7/contrib/masmx86/bld_ml32.bat" を開いて次の箇所を確認
ml /coff /Zi /c /Flmatch686.lst match686.asm ml /coff /Zi /c /Flinffas32.lst inffas32.asm
- 次のように /safeseh オプションを付け加える
ml /coff /Zi /c /safeseh /Flmatch686.lst match686.asm ml /coff /Zi /c /safeseh /Flinffas32.lst inffas32.asm
- "ビルド" -> "ソリューションのクリーン" でソリューション全体を一度クリーンする
- ビルドを実行する
- 次のような警告は出るけど、とりあえずはおっけー(?)
3>adler32.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 1>adler32.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 4>testzlib.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 6>miniunz.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 5>minizip.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。
解決策(2) - /SAFESEH を特に指定しないようにする(/SAFESEH:NO にするわけではない)
- zlib 1.2.7 の Visual Studio 2010 用のソリューションファイル (.sln) を Visual Studio 2012 RC 用に変更すると、リンカーオプションに /SAFESEH が勝手に追加されます(未確認ですが環境によっては追加されない場合もあるそうです)
- Visual Studio 2010 用のソリューション・プロジェクトファイルを見る限り、/SAFESEH オプションは何も指定されていません
- リンカ―の詳細設定から /SAFESEH に関する指定を外してあげます
- ソリューションエクスプローラから "zlibvc" プロジェクトを選択
- プロジェクト -> プロパティ -> 構成プロパティ -> リンカ― -> 詳細設定 -> "安全な例外ハンドラーを含むイメージ"
- 「はい (/SAFESEH)」または「いいえ (/SAFESEH:NO)」が指定されている場合、項目を削除して何も指定しないようにします。(backspace キーか delete キーで指定されている文字「はい (/SAFESEH)」または「いいえ (/SAFESEH:NO)」を消しちゃってください)
- zlibvc プロジェクトと同様に、miniunz, minizip, testzlib, testzlibdll プロジェクトの /SAFESEH に関する指定を外します
- "ビルド" -> "ソリューションのクリーン" でソリューション全体を一度クリーンします
- ビルドします
- Release(または Debug)でビルドするときに /SAFESEH に関する指定を外すのを忘れないように。