【问题标题】:Makefile rule using the automatic variable $^ without dependencies使用自动变量 $^ 的 Makefile 规则,没有依赖关系
【发布时间】:2013-04-06 13:08:09
【问题描述】:

我从 GNU Make 手册中了解到符号 $^ 是一个自动变量,它代表所有先决条件的名称。但是我发现了一个像这样的makefile:

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 $@

【问题讨论】:

    标签: variables makefile prerequisites


    【解决方案1】:

    $^ 包含目标的所有先决条件,而不仅仅是规则本身提到的那些。同一个文件可以在没有命令的规则中多次作为目标出现:

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

    sometarget 的依赖是dependency1dependency2dependency3,当assemble 命令被make sometarget 调用时,它将接收所有三个作为参数。

    这里,$^ 将包含所有 $(CLT_OBJECT_FILES)$(SRV_OBJECT_FILES),具体取决于执行命令的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多