4

Visual C++ を使用した開発作業のほとんどで、部分ビルドを使用しています。たとえば、F7 キーを押すと、変更された C++ ファイルとその依存関係のみが再ビルドされ、その後にインクリメンタル リンクが続きます。バージョンをテストに渡す前に、現在のプロジェクトで約 45 分かかります。この行動を支持する多くの投稿や記事を見てきましたが、これが必要なのだろうか? もしそうなら、なぜでしょうか? 配信された EXE または関連する PDB (テストでも使用) に影響がありますか? テストの観点から見て、ソフトウェアの機能に違いはありますか?

リリース ビルドでは、VS2005、インクリメンタル コンパイルとリンク、プリコンパイル済みヘッダーを使用しています。

4

6 に答える 6

6

部分ビルド システムは、ビルド結果に対してソース ファイルのファイル日付をチェックすることによって機能します。そのため、たとえばソース管理から以前のファイルを復元すると、破損する可能性があります。以前のファイルは、ビルド プロダクトよりも前に変更された日付を持つため、プロダクトは再ビルドされません。これらのエラーから保護するには、最終ビルドの場合は完全なビルドを行う必要があります。ただし、開発中はもちろん、インクリメンタル ビルドの方がはるかに効率的です。

編集: そしてもちろん、完全な再構築を行うことで、インクリメンタル ビルド システムで発生する可能性のあるバグを防ぐこともできます。

于 2009-05-11T07:44:21.173 に答える
3

基本的な問題は、コンパイルが環境 (コマンドライン フラグ、利用可能なライブラリ、およびおそらくいくつかのブラック マジック) に依存することです。したがって、2 つのコンパイルは、同じ条件で実行された場合にのみ同じ結果になります。テストと展開のために、環境が可能な限り制御されていることを確認し、奇妙なコードが原因で奇抜な動作が発生しないようにする必要があります。良い例は、システム ライブラリを更新し、ファイルの半分を再コンパイルする場合です。半分はまだ古いコードを使用しようとしていますが、半分はそうではありません。完璧な世界では、これはすぐにエラーになるか、問題を引き起こさないかのどちらかですが、残念ながら、そのどちらも起こらない場合があります。その結果、完全な再コンパイルを行うことで、時間をずらしたビルド プロセスに関連する多くの問題を回避できます。

于 2009-05-11T07:43:46.247 に答える
2

誰もがこの使用パターンに出くわしたことはありませんか? 奇妙なビルドエラーが発生し、調査する前に完全な再構築を行うと、問題は解決します。

これだけでも、リリース前に完全な再構築を行う十分な理由のように思えます。

問題なく完了したインクリメンタル ビルドをテストに回すかどうかは好みの問題だと思います。

于 2009-05-11T07:42:44.437 に答える
2

私は間違いなくそれをお勧めします。大規模な Visual C++ ソリューションで、依存関係チェッカーが変更されたコードの依存関係を検出できないことが何度かありました。この変更がオブジェクトのサイズに影響を与えるヘッダー ファイルに対するものである場合、非常に奇妙なことが起こり始める可能性があります。依存関係チェッカーは VS 2008 で改善されたと確信していますが、リリース ビルドではまだ信頼できません。

于 2009-05-11T08:14:36.303 に答える
2

インクリメンタル リンク バイナリを出荷しない最大の理由は、一部の最適化が無効になっていることです。リンカーは、関数間にパディングを残します (次のインクリメンタル リンクでそれらを簡単に置換できるようにするため)。これにより、バイナリがいくらか肥大化します。余分なジャンプも発生する可能性があり、メモリ アクセス パターンが変化し、余分なページングやキャッシュ ミスが発生する可能性があります。古いバージョンの関数は、呼び出されなくても実行可能ファイルに引き続き存在する場合があります。これは、バイナリの肥大化とパフォーマンスの低下にもつながります。また、インクリメンタル リンクでリンク時のコード生成を使用することはできません。そのため、さらなる最適化を逃してしまいます。

テスターに​​デバッグ ビルドを提供する場合、それはおそらく大したことではありません。ただし、リリース候補は、できれば制御された環境の専用ビルド マシンで、リリース モードでゼロからビルドする必要があります。

于 2011-03-08T19:25:04.547 に答える
1

Visual Studioには、部分的な(インクリメンタルな)ビルドに関するいくつかの問題があります(私は主にリンクエラーに遭遇しました)時々、完全な再構築を行うことは非常に便利です。

コンパイル時間が長い場合は、次の2つの解決策があります。

  1. 並列コンパイルツールを使用して、(想定される)マルチコアハードウェアを利用します。
  2. ビルドマシンを使用します。私が最もよく使用するのは、CruiseControlがセットアップされた別のビルドマシンで、時々完全な再構築を実行します。私がテストチームに、そして最終的には顧客に提供する「公式」リリースは、開発者の環境からではなく、常にビルドマシンから取得されます。
于 2009-05-11T12:44:00.897 に答える