9

これはmakefileの一部にすぎません。何が起こっているのかよくわかりません。

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

私が理解しているのは、これらの行が「print-opts」の後に「cc-command」を使用して.cppファイルを.oにコンパイルすることだけです。しかし、私はセマンティクスを理解していません。

'OBJS'のマクロを展開すると、次のようになります。

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

私には、「$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)」のように見えますが、$(SRC)のすべての.cppは$( OBJ)ですが、これは$(OBJ)/%。oに依存します。これは、$(SRC)/%。cppに依存します。これは意味がありません...

ここでの等号の意味と、複数のコロンの意味がわかりません。

4

1 に答える 1

18

これらの3つの変数を定義したとします(定義していない場合、ルールはうまく機能しません)。

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

今、割り当てを検討してください

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

これは置換リファレンスです; $(SRCS)「フォームのあるものはすべて」と表示さ$(SRC)/%.cpp$(OBJ)/%.oます。したがって、OBJSに評価されobject_dir/foo.o object_dir/bar.oます。

今のルール:

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

Thuisは静的パターンルールです。ターゲットのリスト($(OBJS))、ターゲットパターン($(OBJ)/%.o)、および前提条件パターン($(SRC)/%.cpp)を指定します。Makeはターゲットをターゲットパターンに一致させ、それを使用して前提条件名を作成します。したがって、Makeがこのルールを使用してビルドしobject_dir/foo.oた場合、ステムはにfooなり、前提条件はになりますsource_dir/foo.cpp

(あなたはについて尋ねなかった| print-optsので、私はそれがすでに明らかであると思います。)

于 2012-07-11T14:14:32.603 に答える