2011-07-10 23 views
6

時々、新しい実行可能ファイルが作成されていないように見えますが、必要な場合でもその理由はわかりません。たとえば、Makefileを変更しても実行可能ファイルがすでに存在し、 'make'を実行すると、更新された実行可能ファイルは作成されません。なぜ/きれいなターゲットが必要なのですか?

メークファイルの目的はそれほど心配する必要はありませんか?

答えて

6

GNU make documentation

からソースファイル、または依存関係として指定されたヘッダファイルのいずれかが、オブジェクトファイルよりも新しい場合は、再コンパイルが行われなければならない、またはオブジェクトファイルが存在しない場合。

トリガーするメイクファイルは変更されません。

make cleanは、その間に作成されたすべてのオブジェクトファイルを削除します。 通常はですが、部分的に再コンパイルするのはあまりお役に立ちません。つまり、変更したファイルを再コンパイルし、最後に新しく作成したオブジェクトファイルを既存のファイルとリンクするだけです。それでも、絶対に安全にしたい場合は、makeを再度実行する前にmake cleanを実行する必要があります。

古いオブジェクトファイルを保存する(つまり、決してmake cleanを実行しない)例が問題になる可能性があります。既存のオブジェクトファイルがあるライブラリのバージョン1.0にリンクされているとします。これでマシンが更新され、バージョン1.1がインストールされます。ここで、いくつかの関数は関数1.0と互換性がありません。しかし、あなたのオブジェクトファイルが以前のバージョンを期待してコンパイルされていたので、リンクプロセスは最終的に失敗します。

+0

私はあなたの例では納得できません。ライブラリの更新によってそのインタフェースが変更された場合は、コードに変更を加えなければならず、影響を受けるオブジェクトの再コンパイルが行われます。そこに 'きれいにする '必要はありません。 – eriktous

+0

必ずしもそうではありません - あなたが作業している残りのファイルがその特定のライブラリに依存しない場合、影響を受けたオブジェクトは再コンパイルされません。 – emboss

+0

オブジェクトが新しいライブラリと互換性がない場合は、インタフェースの変更を反映するためにソースを変更する必要があります。 'make clean'を実行しても、それは消えません。リンクは引き続き失敗します。 – eriktous

1

まあ、それは非常に広い質問です。一般的には、すべての依存関係(それ自身の変更時間を含む)を追跡するmakefileを書くことができます。しかし、それは自明ではなく、バグは他のコードと同じようにmakefileにクロールすることができます。だから時には、すべてをきれいにして、何かが正しく構築されていないと思ったときに再構築する方が簡単な場合もあります。

sconsのように、メイクファイルよりも堅牢で自動化されたものがたくさんあります。other build toolsがあります。

1

Makefilesで定義された依存関係を解析し、依存関係グラフを構築します。

prequisitesが出力(バイナリ)変更によって必要とすることが検出された場合は、再構築されているか、少なくとも変更された部分です。

したがって、依存関係にMakefileが含まれていると、Makefileを変更した後にバイナリを更新することはできません。

Life with Makefilesは必ずしも簡単ではありませんが、とにかくお手伝いできます。

関連する問題