ぼく用あれこれまとめ

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)と混同しないよう注意してください。



ダウンロード

  • 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 に関する指定を外すのを忘れないように。


参考文献

記事メニュー
目安箱バナー