Can some one explain other than the debugging symbols being embedded in the debug build, if there is any other difference. Further I am very curious as to know how they differ in executing binary. What mechanisms are being used use debug symbols in the debug build show the errors.
2 に答える
多くのqtライブラリで使用されるコンパイラ呼び出しの -DQT_NO_DEBUG フラグをqtセットでデバッグとしてコンパイルします。Jimmy がすでに指摘したように、パフォーマンスの主な違いはこのソースによるものです。極端な例の 1 つは、境界のチェックに使用できる STL コンテナーのデバッグ バージョンの使用です。これをデバッグ モードのコードで使用すると、処理に時間がかかる場合があります (Qt はこれを使用しませんが、ライブラリに同様のチェックを導入します)。
さらに通常、最適化フラグが変更されます。リリースの場合、デバッグの最適化ではなく、リリースに -O2 が選択されます
デバッグ ビルドに関するもう 1 つの重要な点は、定義の追加、ターゲットの変更、別のライブラリ セットに対するコンパイルなど、pro ファイル内のさまざまなことをトリガーするために使用できることです。
CONFIG(debug, debug|release) {
message("Debug")
DESTDIR = $$DESTDIR-debug
CONFIG += debug
DEFINES += DEBUG
TARGET = $$TARGET-debug
}else{
message("Release")
DEFINES += QT_NO_DEBUG_OUTPUT
DESTDIR = $$DESTDIR-release
TARGET = $$TARGET-release
}
詳細に興味がある場合は、qmake 構成ファイルを参照してください。Linux Ubuntu: /usr/share/qt4/mkspecs/common/g++.conf /usr/share/qt4/mkspecs/common/linux.conf およびターゲットに依存する conf ファイル
「リリースビルド」と「デバッグビルド」の正確な定義と動作は、使用するビルドシステムとコンパイラによって異なります。デバッグビルドと比較したリリースビルドのいくつかの一般的なプロパティ:
- デバッグビルドは通常、デバッグ情報を生成しますが、リリースビルドは生成しません。ただし、個別のデバッグ情報を使用したリリースビルドなど、いくつかのハイブリッドがあります。
- アサーションは評価されません(assert(p = getFoo());何も割り当てません-またはアサートしません)。したがって、assert内に副作用がある式は悪い考えです。
- 最適化設定は通常異なります(デバッグビルドでは最適化がないか、ほとんどありません)
- デバッグ出力が抑制される可能性があります
- ライブラリ開発者は、NDEBUGプリプロセッサマクロなどに応じて、さらに異なる動作を実装する可能性があります