4

GNU Make マニュアルから、符号 $^ はすべての前提条件の名前を表す自動変数であることを学びました。ただし、次のようなメイクファイルに遭遇しました。

SVR_OBJECT_FILES =      server.o\
                        server_func.o

CLT_OBJECT_FILES =      client.o

CFLAGS =                -Wall -Werror -W


CC =                    gcc

all:                   client/client server/serveur

client/client:         $(CLT_OBJECT_FILES)

server/serveur:        $(SVR_OBJECT_FILES)

client/client server/serveur:
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $^ -o $@

%.o: %.c
    $(CC) -c $<

clean:
    rm -f client/client server/serveur *.o

これはうまく機能するので、私の質問は次のとおりです。 $^ 変数が前提条件をまったく参照していないときに、以下のコマンドで正しいオブジェクトファイルをリンクするにはどうすればよいですか。(ルールに前提条件はありません)

 $(CC) $(CFLAGS) $^ -o $@
4

1 に答える 1

5

$^ルール自体で言及されているものだけでなく、ターゲットのすべての前提条件が含まれています。コマンドのないルールでは、同じファイルがターゲットとして複数回表示される場合があります。

sometarget: dependency1
…
sometarget: dependency2
        assemble -o $@ $^
…
sometarget: dependency3

の依存関係sometargetdependency1dependency2およびdependency3であり、assembleコマンドが によって呼び出されるmake sometargetと、3 つすべてを引数として受け取ります。

ここには、コマンドが実行されるターゲットに応じて、$^すべてが含まれます。$(CLT_OBJECT_FILES)$(SRV_OBJECT_FILES)

于 2013-04-06T13:35:33.297 に答える