C++ダイナミックライブラリに関する質問があります。通常、C++ダイナミックライブラリは.libファイルと.dllファイルで構成されています。よく理解していれば、.libファイルにはエクスポートされた関数の位置が記録され、.dllには実装が含まれています。リリースバージョンにはいくつかの最適化があることを知っているので、リリースdllとデバッグdllは異なるはずです。それでは、リリースlibファイルとデバッグlibファイルの主な違いは何ですか?lib(またはdll)ファイルがリリースバージョンまたはデバッグバージョンであるかどうかを確認する方法はありますか?リリースバージョンプログラムがデバッグバージョンライブラリを呼び出すとどうなりますか?ありがとう!
1 に答える
「Release」と「Debug」は、コンパイラとリンカーのフラグと設定のセット全体の単なるラベルであり、多くの場合、内部の「Release」ビルドは引き続きデバッグ情報を生成しますが、より高い最適化設定があります。
したがって、「d」の接尾辞やライブラリの場所などで明示的に示されていない限り、libまたはDLLが「リリース」バージョンか「デバッグ」バージョンかを判断する標準的な方法はありません。
「リリース」構成の実行可能ファイルが「デバッグ」構成ライブラリを呼び出すとどうなるかは、2つの間で異なる特定のコンパイルとリンカーの設定によって異なります。ほとんどすべての場合、あなたは多くの問題を抱えることになります、時には非常に明白に、時にはもう少し知らぬ間に。いくつかの一般的な問題の原因:
両方のライブラリは、ランタイムライブラリの異なるバージョンを使用している可能性があり、メモリ割り当てプールやそのカウンタなど、実行可能ファイル内のすべてのライブラリで静的で同じであると想定される特定の変数の異なるコピーを持っている可能性があります。歩哨。症状は、奇妙なメモリ割り当て/割り当て解除のバグが発生することです。
ライブラリは、セキュリティ設定やイテレータのデバッグなど、標準ライブラリでさまざまな規則を想定している場合があります。これにより、「標準」コンテナのメモリレイアウトがライブラリ間で実際に異なり、運が良ければアクセス違反が発生し、そうでない場合は予測できない動作が発生します。