ぼく用あれこれまとめ

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 コンパイラを使います

ダウンロード

  • 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 に合わせればおっけーです。

参考文献

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