質問の動機: 64 ビット コードと 32 ビット コードを生成するには、2 つの個別のフル プログラム コンパイルが必要です。ビジュアル スタジオを使用する場合 (以下で詳しく説明します)、リリース ビルドとデバッグ ビルドには互換性がないため、さらに 2 つのフル プログラム コンパイルが必要になるようです (合計で 4 つになります)。2 つの完全なプログラム コンパイルに固執したいのですが、混乱しています。
デバッグ時に気になるのは、クラッシュの原因となったコードのグローバル状態、スタック フレーム、および行番号/ファイルです。また、査読済みの非常に安定したオープンソース ライブラリからのデバッグ情報も気にしません。したがって、これらのライブラリのデバッグ情報は必要なく、このライブラリのリリース ビルドで十分です。
証拠: VS では、アプリケーションのデバッグ バージョンをコンパイルし、それを Google Protocol Buffers のリリース バージョンとリンクすると、リリース タイプとデバッグ タイプが混在する副作用により、生成されたコードが失敗することがわかっています。
これが Visual Studio を使用することの副作用であるかどうかを知りたいのですが、特定のコンパイラ スイッチのセットがそうなっています。
次に、オープンソース プロジェクトのビルド スクリプト/プロセスを調べると、デバッグ モードで生成されたコードとリリースで生成されたコード (たとえばmumble ) を混在させても問題ないようです。これは、 release と ReleaseWithDebugInfo の違いと関係があると思います (cmake から借用した用語ですが、これは Visual Studio 内で明らかに表現可能です)。ReleaseWithDebugInfo は、バイナリの最適化されたバージョンであり、デバッグ情報も生成されるため、リリースに適しています。
質問 :
- どのスイッチがコードを非互換にするかについて、誰かが説明するか、参照を提供してください。
- Visual Studio でコンパイルする ReleaseWithDebugInfo スタイルは、デバッグとリリースの両方のユースケースに十分ですか (上記で説明したように、私の基準によると)? --つまり、コンパイラがデバッグモードで生成するものは何でもやり過ぎですか、それとも冗長ですか?
- ReleaseWithDebugInfo モード (私のアプリケーション用) で、リリース モード (デバッグ情報なし) で外部依存関係をコンパイルし、未定義の動作を持たないようにすることはできますか?