0

makeマニュアル自動依存関係の生成を読んでいましたが、なぜこの機能が必要なのか理解できません。私が取り組んでいて、最初から書き始めたプロジェクトは、次のように構成されています。

  • 各ユニット(ライブラリ)には独自のフォルダがあります
  • 各.cppファイルには、同じディレクトリにある同じ名前の単一の.hファイルが含まれている必要があります。OK、このルールは、循環依存の場合のように、少し制限が厳しすぎる可能性があります。その場合、次のルールで説明するように、別の.hファイルを含めることができます。
  • .hファイルに他のヘッダーを含める場合、依存関係が別のユニット(ライブラリ)にある場合は、常にプロジェクトのルートディレクトリに相対的なパスを使用してください。それ以外の場合は、ファイルの名前を含めてください。

makefileで-I .、コンパイラに渡します。ディレクトリXで.cppファイルを検出すると、同じディレクトリ(または.ディレクトリ)で.hファイルを検索します。.hファイルを解析するときに、.フォルダーに関連するインクルードが検出されるため、それらを探す場所がわかります。

さて、コードが上記のように構造化できる場合、なぜ誰かが-Mフラグを使用して依存関係のリストを生成し、sedを混乱させてあいまいな.dファイル(依存関係を表す)を生成したいのでしょうか?コードファイルから依存関係の特定のリストを生成する意味がわかりません。

4

2 に答える 2

4

実際には、各ソースファイルは複数のヘッダーファイルに依存するためです。これらのヘッダーのいずれかが変更されるたびにソースファイルを再コンパイルしないと、バイナリの一貫性が失われる可能性が高くなります。

于 2012-07-06T00:03:28.227 に答える
1

それがmakeppの仕組みです。依存関係は自動的に検出されます。あなたの場合、makefileも必要ありません(コマンドでターゲットを指定してもかまわない場合)。

組み込みのリンカルールには、オブジェクトファイルを自動的に推測するという利点があります。と言うとmakepp proggie、proggie.c(または.cppなど)をスキャンしてincludeステートメントを探します。ステートメントごとに、ビルドできる一致する.oファイルがあるかどうかを確認し、ある場合はそれを再帰的にスキャンします。この方法で検出されたすべての.oファイルは、ビルドされてリンクされます。

または、makefileをワンライナーにして、毎回ターゲットを指定しないようにすることもできます。

$(phony all): proggie
于 2012-07-08T15:55:48.540 に答える