web-dev-qa-db-ja.com

'_ITERATOR_DEBUG_LEVEL'で不一致が検出されました:値 '0'が値 '2'と一致しません

VS2010でビルドすると、次のリンクエラーの多くを引き起こすライブラリをビルドします。

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2'

その結果、ライブラリのリリースバージョンとデバッグバージョンの両方を出荷する必要があります。 libのデバッグバージョンを出荷する理由はなく、バイナリディストリビューションを肥大化させるだけです。しかし、デバッグに組み込まれているクライアントコードは、私のリリースライブラリに対してリンクすることを拒否します。

この質問が以前に表示されたのを見たことがありますが、彼らは正しい質問をしているようには見えません。私はこのエラーが何であるか、そしてなぜ私がそれを得るのかを理解しています(まあ、ある種;何が依存関係を放出するのか正確にはわかりません。あなたは?)、しかし私が知りたいのはこの依存関係の発生を排除する方法です私のライブラリで?

競合するCRTが使用されたときに文句を言うライブラリと同様に、/ Zl(オブジェクトファイルからデフォルトのライブラリ名を省略する)で防ぐことができますが、この依存関係がライブラリに出力されるのを防ぐ方法は確かにありますか?

デバッグコードまたはリリースコードのいずれかに対してリンクできる単一の最適化されたライブラリを作成したいだけです。クライアントコードがライブラリをデバッグすることは重要ではありません。異なるデバッグバージョンとリリースバージョンが付属しているサードパーティライブラリはほとんどありません。ベンダーがこの問題を回避するのはどうしてですか?

このリンクの依存関係の原因と、それを完全に無効にする方法、またはコードから除外する方法を正確に知っている人はいますか?

10
Manu Evans

デバッグビルド設定でコンパイルされたコードを、リリースビルド設定でコンパイルされた他のコードでイテレーターデバッグを有効にしてリンクしています。

このリンクエラーは、そのように足を吹き飛ばすことを防ぎます。さて、両足、左腕、右手の人差し指は、あごでマウスを操作する必要があります。たとえば、レイアウトが異なるstd :: stringオブジェクトから発生するランタイムエラーは、診断が非常に困難です。ヒープの破損は厄介な問題であり、デバッグするのが最悪です。同じ設定でコードを再コンパイルする必要があります。他の方法はありません。

9
Hans Passant

同じ問題ですが、回帰テストを作成し、コマンドラインのコンパイルとリンクをスクリプト化していました。デバッグビルドを実行するときに、コンパイル行の/ D_DEBUGを忘れてしまいました。

1
Ed Harcourt

他の場所で見つけたブーストコードのセットをコンパイルしようとしたときにわかったことの1つは、内部的に_SECURE_SCL = 1と_HAS_ITERATOR_DEBUGGING = 1が定義されていることでした。私のビルドはデバッグであり、通常はイテレーターレベルを2に設定していましたが、取得したこのインクルードコードは、0にオーバーライドしていました。 (そして私はそれを掘り下げるまで気づきませんでした)それは、イテレータレベルが2に設定されたデフォルトでビルドされたデバッグブーストライブラリに対してリンクしていました。したがって、不一致が発生します。この不一致は、2015年より前に作成されたブーストライブラリを使用してVS 2015+でビルドしようとした場合にも発生する可能性があります。ただし、その可能性はほとんどありません。

0
eric frazer