28

サードパーティ ライブラリのリリース バージョンをデバッグ バイナリで使用するのは悪い習慣ですか?

サードパーティのライブラリを使用しており、リリース .lib ライブラリをコンパイルしました。私のexeはデバッグモード開発中です。それから私は得ました:

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in test1.obj

グーグルで調べたところ、リリースとデバッグを混在させようとしていることがわかりました。おそらく、ライブラリをデバッグモードでコンパイルするか、_ITERATOR_DEBUG_LEVELマクロをいじる必要があります。しかし、それが推奨される方法であり、その理由であるかどうか、私はただ興味があります。使用するすべてのサード パーティ ライブラリのリリース バイナリとデバッグ バイナリの両方をコンパイルして記録しておく必要があるのは面倒に思えますが、これらのコードをデバッグするつもりはありません。

4

3 に答える 3

33

デバッグ コードとリリース コードを混在させることは悪い習慣です。問題は、異なるバージョンが C++ ランタイム ライブラリの異なる基本部分に依存する可能性があることです。たとえば、メモリの割り当て方法、イテレータなどの構造が異なる可能性があること、操作を実行するために余分なコードが生成される可能性があることです (チェック イテレータなど)。

これは、他の異なる設定でビルドされたライブラリ ファイルを混在させることと同じです。ヘッダー ファイルに、アプリケーションとライブラリの両方で使用される構造が含まれている場合を想像してください。ライブラリは、構造体のパッキングとアラインメントを 1 つの値に設定して構築され、アプリケーションは別の値で構築されます。サイズやメンバーの位置が異なる可能性があるため、アプリケーションからライブラリへの構造体の受け渡しが機能するという保証はありません。

サードパーティのライブラリを DLL としてビルドすることはできますか? 関数へのインターフェイスがよりクリーンで、STL オブジェクトを渡そうとしないと仮定すると、デバッグ アプリケーションとリリース DLL を問題なく混在させることができます。

于 2012-07-25T21:41:04.293 に答える
6

コンパイルされないという事実は、それが悪い習慣であることを証明するのに十分なはずです.

別々のビルドを維持することについて - あなたはそれをする必要はありません。以前に私のために働いた回避策は次のとおりです。

#ifdef _DEBUG
#define DEBUG_WAS_DEFINED
#undef _DEBUG
#endif

#include <culprit>

#ifdef DEBUG_WAS_DEFINED
#define _DEBUG
#endif

これがうまくいくかどうか教えてください。

于 2012-07-25T21:33:29.267 に答える