web-dev-qa-db-ja.com

コードを変更するたびに新しいビルドが必要ですか?

私は約100の異なるファイル(.cppと.h)を含むプロジェクトで作業しており、MSVC 2008でプロジェクト全体をビルドするには約1時間かかります。プロジェクト全体を最初からもう一度ビルドする必要がありますか、それとも解決策はありますか?

私はそれが非常にnoobのようであることを知っていますが、私は多くの時間を浪費しているので、私は思っていました

4
potato man

短い答え:場合によります。

長い答え:ソースコードの依存関係によって異なります。

たとえば、すべてのクラスがプロジェクト内の他のすべてのクラスを知っている場合、1つに変更を加えるたびに、おそらくもう1つを再コンパイルする必要があります。

リンケージにも依存します。すべてを1つのバイナリファイルにリンクすると、すべてが再度コンパイルされる可能性もあります。より良い方法は、異なる共有ライブラリ(DLL)に分離するか、少なくとも個別のオブジェクト(.o)ファイルに分離することです。

ただし、(後者の場合)オブジェクトファイルをいじって、オブジェクトファイルを再コンパイルして再度リンクするだけですべてのオブジェクトファイルが再コンパイルされないことを確認する必要がある場合があります。

しかし、繰り返しになりますが、おそらくリンク処理にも時間がかかります。基本的にそれを試す必要があります。

最後に... 時間ビルド用〜100ファイル本当に古いマシンで実行しているのでなければ、wayが多すぎます。または、各ファイルに数万行が含まれていない限り。

7
Yam Marcovic

ビルドには2種類あります:cleanビルドとincrementalです。

A クリーンビルドは常に最初から始まります。入力としてベアプロジェクトのみを取り、依存関係を計算し、すべてのパーツを順番にビルドして、最終的な出力に組み立てます。クリーンビルドは、定義により、プロジェクト内のすべてのソースファイルを再コンパイルする必要があります。これを実行している間、それは.objファイルなどの中間ファイルを生成しますが、これらはソースバイナリでも出荷可能なバイナリでもありません-ビルドが完了すると、それらを破棄できます(これはBuild>Clean Solutionが行うことになっていることです) )、または後で使用するためにそれらをそのままにしておくことができます。

増分ビルド。インクリメンタルビルドは、すべてのソースファイルの最終変更日を、生成された中間ファイルのタイムスタンプと比較し、それに依存する他のもの(「ターゲット」)も比較します。ターゲットが最後にビルドされた後に依存関係が変更されている場合は、ターゲットが再ビルドされます。それ以外の場合は、前のビルドのファイルが再利用されます。たとえば、users.cがあり、これがusers.obj(ビルドターゲット)にコンパイルされ、users.hおよびbasics.h(依存関係)が含まれている場合、インクリメンタルビルドは、これらすべてのファイルのタイムスタンプ、およびそれらのいずれかがusers.objのタイムスタンプより新しい場合、users.objが再構築されます。それ以外の場合、既存のusers.objは有効と見なされ、この特定のビルドステップはスキップできます。

インクリメンタルビルドは必要なもののみを再ビルドするため、通常、クリーンビルドよりもはるかに高速です。大規模でありながら構造化されたプロジェクトの場合、違いはほんの数秒と昼休みの1つです。

ただし、依存関係を正しく決定すると、ブラックマジックの境界になり、一部の全体設定ではすべての中間体が無効になるため(たとえば、ターゲットアーキテクチャを切り替える場合)、「本物」が必要な場合は、ほとんどの人が完全なクリーンビルドを行うことをお勧めします。実際、ほとんどすべての継続的インテグレーションのセットアップ(ビルドサーバーが新しいコードがマスターリポジトリにプッシュされるたびに完全なビルドが実行され、完全に自動化される)は、クリーンビルドを使用します。 本当に本当に最新。

6
tdammers

これが本当に重要なポイントです。再構築する必要があるものだけを再構築してください。そのため、ビルドディレクトリにダンプするなど、作業中にビルドされたコンポーネントが邪魔にならないようにメイクファイルを設定する必要があります。また、依存関係を変更した場合にプロジェクトの関連するセクションが再コンパイルされるように、適切な依存関係が設定されている必要があります。

私はあなたがあなたのプロジェクトのために持っているmakefileを通して、そしてすべての異なった部分が何をするかを学ぶことを勧めます。これはもう1つの重要で便利なツールです。 manual はそれほど長くはなく、すべてを網羅しています。または、 Gnu Makeを使用したプロジェクトの管理 を読むことができます。これは、makeが単なるソフトウェアコンパイラではないことを説明しています。

1
Spencer Rathbun

'make clean'は、既存のプロジェクト(例:ダウンロードして解凍した直後、またはすべてが最新であることを確認したい場合。リリース用。ほんの数個のファイルが変更された場合、単純な「make」で十分です。その後、変更されたファイルのみを検索してコンパイルし、その結果を既にコンパイルされたファイルとリンクして完成したバイナリを作成するのは、「make」ユーティリティ次第です。

1
ProphetV