8

重複の可能性:
デバッグ/リリースの違い

デバッグビルドとリリースビルドの2つの意味と、両方の違いを知りたいです。

VisualStudioで単純なC++プロジェクトを作成する場合、どちらを使用する必要があり(つまり、それぞれに適した条件はどれか)、実際に使用しているビルドはどれですか。[プロジェクトの設定を変更しない場合]

wxWidgets 2.9.4を使用してGUIを作成しようとしているので、これを求めています。必要な.libを追加する場合が異なります。これらは

release ANSI static

debug ANSI static

release Unicode static

debug Unicode static

詳細な回答をお願いします。

4

4 に答える 4

28

デバッグビルドとリリースビルドは単なる名前です。彼らは何の意味もありません。

アプリケーションに応じて、コンパイラとリンカのオプションのさまざまな組み合わせを使用して、1つ、2つ、またはそれ以上の異なる方法でアプリケーションを構築できます。 ほとんどのアプリケーションは、単一のバージョンでのみビルドする必要があります。クライアントが使用するのとまったく同じプログラムをテストおよびデバッグします。場合によっては、2つの異なるビルドを使用する方が実用的かもしれません。全体として、パフォーマンス上の理由からクライアントコードを最適化する必要がありますが、デバッグ時に最適化する必要はありません。また、完全なデバッグ(つまり、イテレーターの検証など)によって、アルゴリズムのデバッグでもコードが遅すぎる場合があるため、完全なデバッグチェックを含むビルドを作成します。最適化は行われていませんが、イテレーターのデバッグは行われません。 、および最適化されたもの。

アプリケーションを起動するときはいつでも、必要なオプションを決定し、対応するビルドを作成する必要があります。あなたはそれらを好きなように呼ぶことができます。

外部ライブラリ(wxwidgetsなど)に関して:異なるオプションを使用すると、すべてのコンパイラにいくつかの非互換性があります。したがって、(ソース形式以外で)ライブラリを提供する人は、いくつかの問題に応じて、いくつかの異なるバージョンを提供する必要があります。

  • リリースとデバッグ:リリースバージョンは、多かれ少なかれ標準的な最適化オプションのセットを使用してコンパイルされています(イテレーターのデバッグはありません)。最適化なし、およびイテレータデバッグありのデバッグバージョン。イテレータのデバッグが存在するかどうかは、通常、バイナリ互換性を損なうものの1つです。ライブラリベンダーは、各バージョンと互換性のあるオプションを文書化する必要があります。

  • ANSI vs. Unicode:これはおそらく 文字データの狭いcharvs広いことを意味します。wchar_tアプリケーションで使用するものに対応するものを使用してください。(これら2つの違いは、一部のコンパイラスイッチだけではないことに注意してください。根本的に異なるコードが必要になることが多く、すべての場合でUnicodeを正しく処理することは簡単ではありません。実際にUnicodeをサポートするアプリケーションは、文字の作成などを認識している必要があります。または双方向書き込み。)

  • 静的vs.動的:これにより、ライブラリのリンク方法とロード方法が決まります。通常、少なくとも、アプリケーションを開発しているマシン以外のマシンにアプリケーションをデプロイすることを期待している場合は、静的が必要になります。ただし、これはライセンスの問題にも依存します。ライブラリがデプロイされているマシンごとにライセンスが必要な場合は、動的を使用する方が理にかなっている場合があります。

于 2012-08-09T12:30:23.973 に答える
7

DEBUGビルドを行う場合、プロジェクトは、生成されたコードを最適化しない(または非常に軽く最適化する)ように設定され、デバッグ情報(関数、変数、およびデバッグに必要なその他の情報を含む)を追加するようコンパイラーに指示します。プリプロセッサは、_DEBUGマクロを定義するように設定されています。

RELEASE一方、ビルドはより高いレベルの最適化があり、デバッグ情報は保存されません。プリプロセッサは、NDEBUGマクロを定義するように設定されています。

もう1つの違いは、特定の「システム」マクロ、たとえばマクロのように、またはが定義さASSERTれているかどうかに応じて異なることを行うことです。リリースビルドでは何もしませんが、デバッグビルドではチェックして中止します。_DEBUGNDEBUGASSERT

Unicodeとnon-の違いは、UnicodeほとんどのUNICODE場合、特定のUnicode機能を有効にする必要があるかどうかをヘッダーファイルに通知するプリプロセッサマクロです。1つは、UnicodeビルドでTCHARは定義さwchar_tれますがchar、非Unicodeビルドでは定義されます。

于 2012-08-09T12:31:46.123 に答える
3

デバッグビルドでは、より多くのエラーチェックが発生するため、問題が発生した場合は、より有益なメッセージが表示される可能性があります(実行速度が遅くなります)。

デバッグビルドでは、デバッガーで実行すると、より多くの情報が得られます。

プロジェクトプロパティのプリプロセッサ定義を確認することで、ビルドがデバッグビルドであるかどうかを確認できます。_DEBUGが定義されます。

リリースビルドをクライアントに送信します。(デバッグビルドは、ほとんどの非開発マシンには存在しないデバッグライブラリを使用します)

于 2012-08-09T12:16:28.680 に答える
3

静的ライブラリをプロジェクトにリンクする場合は、コードのコンパイルに使用するのと同じ設定でコンパイルする必要があります。そのため、ライブラリにはデバッグバージョンとリリースバージョンがあります。さらに、Unicodeとansiのどちらを使用するかを指定する必要があります。ここでの答えは非常に単純です(私の意見では)-ユニコードを使用するだけです。

リリースとデバッグの違いは何ですか?それらが混ざり合うことはありませんか?主にメモリ管理です。デバッグのメモリ管理は、エラーを早期に発見できるようにするために多くの追加機能を実行します。例として、コードの上書きをチェックできるカナリアがあります。初期化されていないメモリは特定のパターンで初期化されます...さらに、リリースにはデバッグで使用されない多くの最適化があります。これにより、リリースをより高速に実行できますが、コードのデバッグが困難になります。メソッドは最適化されてインライン化される可能性があり、パラメータの受け渡しはレジスタを使用するように最適化される可能性があります...

したがって、C ++では(少なくとも)2つの構成を管理します。デバッグライブラリとリンクする1つのデバッグ構成。これは開発とテスト用です。また、リリースライブラリにリンクされたリリース構成。これは配達用です。ただし、リリースをテストする必要があることを忘れないでください。また、リリースはデバッグ構成とは異なる動作をする可能性があります。

于 2012-08-09T12:29:18.687 に答える