VS2012 ライブラリ(lib)のリンク _ITERATOR_DEBUG_LEVELとRuntimeLibrary

DirectX11 DirectXTexでテクスチャ対応でReleaseビルドしたlibファイルをDebugビルドで使用するとライブラリ実装の不一致エラーが出てしまう問題を回避してみる。(libファイルだけ公開されているライブラリを組み込むときに同じ問題が発生するかもしれないので)

まずは_ITERATOR_DEBUG_LEVEL
_ITERATOR_DEBUG_LEVEL=0でSTLコンテナなどのイテレータ範囲チェック無効(Releaseビルド)
_ITERATOR_DEBUG_LEVEL=2で範囲チェックあり(Debugビルド)
STLの実装が異なってしまうため混在不可能。
参考_ITERATOR_DEBUG_LEVEL
プロジェクトのプロパティに対応する項目がないか探したが発見できなかったので
C++/プリプロセッサの定義に”_ITERATOR_DEBUG_LEVEL=0″を追加して回避

次にRuntimeLibrary
プロジェクトのプロパティ/C++/コード生成/ランタイムライブラリ
の項目をライブラリと同じ設定にする。(/MT /MD)

これでリンクできるはず、コンパイル&リンクしてみると

「お前は何を言っているんだ」
意味不明、プロパティは何度確認しても”マルチスレッドDLL(/MD)”、色々なプロパティをいじってみるが解決しない。
もしかして、プリプロセッサ定義の”_DEBUG”が原因かと考え削除してみる。
正解でした。
“_DEBUG”を定義すると強制的にデバッグ用ランタイムライブラリがリンクされるみたい。

とここまでやってみて、気付いたのは「デバッグビルドの意味がない」。
よほどのことがない限り、この回避方法を使うことはなさそうです。

今後の注意点
●”_DEBUG”を使ったデバッグ用コードの切り替えはせずに、自分で専用の定義を用意
ソースコードだけでなくリンクにも影響してしまう。

●_ITERATOR_DEBUG_LEVEL=2にするとSTL関連の処理が遅くなる
調べる途中で発見Windowsのマルチスレッド デバッグなSTLはリリース版の1000倍遅いことがある
予想以上に処理速度に影響がありそう。

●簡易Debugビルド(Releaseビルドの最適化なし、デバッグ情報あり)を用意
処理速度が求められるゲームプログラムなどでは、Debugビルドは遅すぎて使えないはず。そのためVS2012(Microsoft)環境でのデバッグ機能にできるだけ頼らず、自分でデバッグ機能を準備したほうがいい。

ちょっと実験してみた
標準ライブラリ(iostream,vectorなど)に依存しないライブラリを作ってリンクするとどうなるか
予測(期待?)通り、エラーなし、コンパイル&リンク成功。
#include <vector>や#include <iostream>
などとincludeしただけで不一致エラーが発生してリンク失敗。
これで判明したのは
「リンクで不一致エラーを発生させないように汎用的なライブラリを作成するには、標準ライブラリを使用しないこと」

標準ライブラリって……なんだろう。

「VS2012 ライブラリ(lib)のリンク _ITERATOR_DEBUG_LEVELとRuntimeLibrary」への2件のフィードバック

  1. 私もRuntimeLibrary不一致のエラーが出ましたが、原因はDirectXTexをスタティックライブラリ化する時点でMT/MTdにし忘れてたことでした。デフォルトではMD/MDdになっています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.