2016-04-27 13 views
1

ビジュアルスタジオ2015コミュニティ版では、以下のファイル構造でデバッグビルドを行います。 A.cppとB.cpp A.cpp、B.cppとC.cppなぜ、すべてのcppファイルが再コンパイルされないのですか?

を含む main.cppにを含むA.cpp C.cppを含む

A.cpp B.cppですからA.cppをデバッグモードで変更するとA.cppとmain.cppだけが再コンパイルされますが、リリースビルドモードに入るとA.cppだけが再コンパイルされます。リリースモードのコンパイルでは

:また、私はいくつかのようなメッセージを取得する17個の機能(0.0%)にコンパイルされたの0は、残りは前回のコンパイルからコピーされました。デバッグモードのコンパイルで

はスキップ...(検出なし関連する変更)

私はすべてのファイルにA.cppを含めると、すべてのファイルを再コンパイルを取得するために期待していた、と私はそれを変更。

P.S.私はそれが.cppファイルを含めるために配線されていることを知っているが、これはちょうど実験であり、私はそれがどのように動作するかを理解したい。

+1

cppファイルに#include "xxxx.cpp"がありますか? – NathanOliver

+0

はい、はい、正確です。どのようにコンパイラはそれを処理する必要がありますか? – Narek

+5

原則として、ヘッダファイルのみを含めるべきです。これを参照してください:http://programmers.stackexchange.com/questions/254233/why-do-we-need-to-include-the-h-while-everything-works-when-including-only-the – NathanOliver

答えて

5

Visual Studioの最小限の再構築は、ファイル単位より細かい粒度で動作します。インラインでない関数の内容を変更するだけで、シグネチャは変わらない場合は、変更されたファイルが含まれていても、Visual C++ツールチェーンで再コンパイルされないことがあります。

解析対象を決めるのにファイルの変更時間が必要ですが、コンパイラはASTレベルの依存関係を適用します。トークンストリームが以前のバージョンと一致し、ASTレベルの入力が変更されていない場合、最適化ステップを繰り返す代わりに、その関数のために以前に生成されたオブジェクトコード。

+0

ニース、私はこれまでに、最小限の再構築が実際に何をしているか、そのような明確な説明を読んだことはありません。 – stijn

+0

私はこれを使用して最小限の再構築を無効にしました:https://msdn.microsoft.com/en-us/library/kfz8ad09.aspxそれでも1つのファイルのみを再コンパイルしました。しかし、私は 'A.cpp'を変更すると、それらのすべてを期待しています。 – Narek

+0

私は** No ** ** Enable Function-Level Linking ** paramにも設定しました。まだ1つのファイルをコンパイルします。コンパイラがスマートすぎる? – Narek

関連する問題