none
複数プロジェクトが設定されたソリューションで、変更したファイルと無関係のプロジェクトもビルドされてしまう

    質問

  • 複数のスタティックライブラリプロジェクトと1つの実行ファイルプロジェクトを統合したソリューションで、たまに、実行ファイルプロジェクトの1つのファイルを更新しただけで、すべてのプロジェクトがビルドされる現象が発生します

    ファイルの依存関係から考えるとあり得ないはずなのですが、環境としては以下のような運用です

    1. VMWare Workstation に Windows 10 FallCreatorsUpdate がインストールされている

    2. Visual Studio 2015 Update 3 がインストールされている

    3. ファイルの変更が入るのは1~2か月に1度くらいの頻度で、その間はほとんど VM はスリープかシャットダウンされている

    感覚としては、1ヶ月の間に何度か更新がかかる場合(多くは不具合修正)はこんなことはあまり起こらない気がしていますが、どうも1ヶ月以上はほったらかした後だと起こりやすい気がしています

    起こるたびに、ターゲットオブジェクトより新しいオブジェクトを探すのですが、見つかりません

    再ビルドがかかるプロジェクトは、変更したファイルとは無関係なので、単にリンクだけが走り、オブジェクトのバイナリを調べるとタイムスタンプだけが更新されている状況です

    ただ、ライブラリプロジェクトは数が多いため、リンクだけでも結構時間がかかり、総ビルド時間がかなりもったいない現象になっています

    ※本来ならEXE1つがコンパイルリンクで済むはずなのでおよそ10倍程度は時間がかかっている感じです

    念のために、変更されるファイルはヘッダとかではなく、他のライブラリプロジェクトとは全く無関係のソース(実装)ファイルです(だから、リンクしか走らないのでしょうけども)

    単純にはビルド時間を減らしたいのですが、もっと深刻なのは、バイナリが違ってしまうということで、本当に機能的な違いがないのかどうかを毎回バイナリレベルでチェックしないといけないということです(実際、単純に古いオブジェクトと比較してみてもタイムスタンプ情報しか違わないので、無視しても大丈夫かもしれないですが)

    以前も同様の現象で質問してみた際、デバッグファイルが壊れている、みたいなことを言われたことがありますが、該当するライブラリすべてのデバッグファイルが壊れているというのも納得がいきません(1つか2つなら、まあしょうがないで済みますが、すべてのプロジェクトで起こるので、仮にデバッグファイルが直接の原因だったとしても、根本的な要因がありそうです)

    こうした現象に何か心当たりのある方はいらっしゃらないでしょうか?

    2018年4月23日 11:49

すべての返信

  • Visual Studioはビルドに関してはMSBuildというツールに任せています。MSBuildは事前に定義されたスクリプトに従ってどのようなコマンドを実行するかを判断しています。[オプション] ダイアログ ボックス、[プロジェクトおよびソリューション]、[ビルド/実行]の項目でMSBuildのログレベルが設定できますので、このログレベルを上げることによって、どのような判断がなされたのかを知ることができます。

    なお、Visual C++の場合、依存関係が一筋縄ではいきません。各オブジェクトファイルを集めて実行ファイルが作成されますが、更にそのあと、実行ファイルにマニフェストが埋め込まれます。そのため、実行ファイルのタイムスタンプ判断が微妙だったりはします。

    ログを見て原因が分からなかった場合の次善策ですが、Visual C++ 2015 Update 1での強化機能にリンク時間の高速化があります。/DEBUG:fastlinkを使うことも検討してください。

    バイナリレベルでチェックがどのような行為を指されているのかわかりませんが、Visual C++ではバイナリファイルと対応するソースコードはハッシュ値で管理されています。今回、ソースコードは変更されていないとのことですので、このハッシュ値を確認することで同じソースコードからビルドされていることを確認できるかと思います。

    いずれかの方法が参考になればと思います。

    2018年4月23日 14:55