Makefile 如何将先决条件列表与Make中的目标列表相关联?

Makefile 如何将先决条件列表与Make中的目标列表相关联?,makefile,Makefile,假设我有: TARGETS = a.o b.o c.o SOURCES = F1/a.c F2/F3/b.c c.c 我想获得: a.o: F1/a.c gcc $< -c b.o: F2/F3/b.c gcc $< -c c.o: c.c gcc $< -c 您可以使用VPATH告诉make有关源目录的信息,然后使用一个简单的模式规则: TARGETS := a.o b.o c.o VPATH := F1:F2/F3 # Use ; instead of :

假设我有:

TARGETS = a.o b.o c.o
SOURCES = F1/a.c F2/F3/b.c c.c
我想获得:

a.o: F1/a.c
  gcc $< -c
b.o: F2/F3/b.c
  gcc $< -c
c.o: c.c
  gcc $< -c

您可以使用
VPATH
告诉make有关源目录的信息,然后使用一个简单的模式规则:

TARGETS := a.o b.o c.o
VPATH := F1:F2/F3 # Use ; instead of : on Windows

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

它通过在目标和源之间加入一个
(先决条件)并对每个目标和源进行评估来工作。

@user3228136但要小心,如果你有共同的名称(例如dir1/a.c和dir2/a.c),它会爆炸。
TARGETS := a.o b.o c.o
VPATH := F1:F2/F3 # Use ; instead of : on Windows

%.o: %.c
    $(CC) -c $< -o $@
TARGETS := a.o b.o c.o
SOURCES := F1/a.c F2/F3/b.c c.c

$(TARGETS):
    $(CC) -c $< -o $@

list-rem = $(wordlist 2,$(words $1),$1)
pairmap = $(and $(strip $2),$(strip $3),$(call \
        $1,$(firstword $2),$(firstword $3))$(call \
        pairmap,$1,$(call list-rem,$2),$(call list-rem,$3)))
gen-prereq = $(eval $1: $2)

$(call pairmap,gen-prereq,$(TARGETS),$(SOURCES))
TARGETS := a.o b.o c.o
SOURCES := F1/a.c F2/F3/b.c c.c

$(TARGETS):
    gcc -c $< -o $@

$(foreach x,$(join $(addsuffix :,$(TARGETS)),$(SOURCES)),$(eval $x))