2012-07-11 10 views
6

これはメークファイルのセグメントに過ぎません。私は何が起こっているのかよく分かりません。メイクファイルの複数のコロンと等号(必要説明)

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) 
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 

私は理解してすべてが 'CC-コマンド' で、 '印刷OPTS' の後、これらの行は.oのに.cppファイルをコンパイルしています。しかし、私は意味論を理解していません。

私は 'OBJS' のマクロを展開すると、この行は次のようになります。。$(SRC)/%CPP = $(OBJ:私に

$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) : $(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 

、それは「$(SRCSでのように見えます)は、$(SRC)のすべての.cppが$(OBJ)の.oに来ると主張していますが、これは$(OBJ)/% /%.cpp。これは意味をなさない...

ここでは等号の意味は何か、複数のコロンは何を意味するのか分かりません。

答えて

14

は、これら三つの変数を定義した(とあなたがいない場合、ルールは非常にうまく動作しません)と仮定します。

SRC = source_dir 
OBJ = object_dir 
SRCS = source_dir/foo.cpp source_dir/bar.cpp 

は今、これは割り当て

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) 

を考えますa substitution reference; 「$(SRCS)の形式が$(SRC)/%.cppの場合は、$(OBJ)/%.oに変更してください」と表示されます。したがってOBJSobject_dir/foo.o object_dir/bar.oと評価されます。今のルール

$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 

Thuisはstatic pattern ruleです。ターゲットのリスト($(OBJS))、ターゲットパターン($(OBJ)/%.o)、前提パターン($(SRC)/%.cpp)を指定します。 makeはターゲットパターンとターゲットをマッチさせ、それを使用して前提条件名を構築します。したがって、Makeがこのルールを使用してobject_dir/foo.oをビルドすると、ステムはfooになり、前提条件はsource_dir/foo.cppになります。

(あなたがおよそ| print-optsを要求していないので、私はそれはすでに明らかだと仮定します。)

+0

はどうもありがとうございました。 gnuの 'make'マニュアルへの参照は非常に参考になります。 (私は前にそのマニュアルを見ていましたが、必要な情報を見つけることができませんでした) – qinsoon

+0

Tadは置換参照で混乱しました。だから私は 'main.c'を持っていれば、それをオブジェクトファイルのディレクトリに張りつめ、ファイルの拡張子を' .o'に変更するだけです。これにより、ファイルの内容が保持され、拡張機能が変更されます。これにより、最終的にすべてのオブジェクトファイルの名前が設定されます。次に、名前のリストをターゲットとして使用し、オブジェクトファイルにコンパイルし、コンパイルしたばかりの新しいオブジェクトファイルでファイルを上書きします。正しい? – Ungeheuer

+0

@Ungeheuer:いいえ、置換参照はファイルに対して何もせず、単に変数を変換するだけです。 "source_dir/main.cpp"を "object_dir/main.o"に変換します。それらは*ファイル名ではなく*ファイル名*です。 "object_dir/main.o"という文字列があれば、その名前のファイルをどのように構築するかを知っているパターンルールに渡すことができます。 – Beta

関連する問題