6

makefileに次のルールがある場合:

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -c -o $@ $< $(CFLAGS)

./obj/プレフィックスとサフィックスに一致するすべてのファイルの.o語幹はに渡される%ため、名前に基づいていくつかの依存関係を提供できます。

しかし、私がこの種のルールを持っていると仮定します。これは、必要なターゲットを1つずつ指定します。

OBJECTS=abc.o bca.o cba.o
$(OBJECTS): $(SRC)/%.c
    $(CC) -c -o $@ $< $(CFLAGS)

makeが実行%している現在のターゲット名に対してステムを実際に機能させるにはどうすればよいですか?使用するだけでは機能しません。%$@

実際のターゲット名を独自の依存関係に書き込もうとしていることに注意してください。たとえば、makeがのルールを実行している場合abc.o、それはそれだけを含みます$(SRC)/abc.c(のようなもの$(patsubst %.o, $(SRC)/%.c, MAGIC_TARGET_NAME_VARIABLE))。

4

2 に答える 2

12

このルールを置き換えることができます:

$(OBJECTS): $(SRC)/%.c

と:

$(OBJECTS) : %.o : $(SRC)/%.c

それでもレシピを作成したい場合は、レシピ$(OBJ)の一部にを追加する必要があります。-o

$(OBJECTS) : %.o : $(SRC)/%.c
     $(CC) -c -o $(OBJ)/$@ $< $(CFLAGS)
于 2013-01-29T01:06:35.607 に答える
1

私はあなたが何を求めているのか完全にはわかりませんが、これはあなたがやろうとしていることを達成すると思います:

OBJECTS=abc.o bca.o cba.o

.PHONY: all
all: $(OBJECTS:%=obj/%)

$(OBJ)/%.o: $(SRC)/%.c
    echo $(CC) -c -o $@ $< $(CFLAGS)

すべての.oファイルがビルドされます。各.oファイルは、.cそれに対応するファイルのみを使用して作成されます。また、ファイルをコンパイルするコマンドですべてのオブジェクトファイルまたはソースファイルのリストを参照する場合は、直接.o参照できます${OBJECTS}


これがあなたがやろうとしていることではない場合、あなたはあなたが持っている入力ファイル、あなたが作りたい出力ファイル、各出力ファイルの入力依存関係、そしてどのようなコンパイルをリストすることによってより良い答えを得ることができます出力ファイルごとに実行するコマンド。

于 2013-01-29T01:02:11.247 に答える