如何在一个规则中制作多个目标

时间:2014-10-27 11:05:56

标签: makefile

在我的工作目录中,我有一些名为foo.cbar.cbaz.c的文件,每个文件都定义了一些方法。我有两个名为a.cb.c的文件。每个都是使用foo.cbar.cbaz.c中的方法的单个程序。我用下面的Makefile

编译ab
TARGETS := a b

OBJS := foo.o bar.o baz.o

all: $(TARGETS)

a: a.o $(OBJS)
    gcc $^ -o $@

b: b.o $(OBJS)
    gcc $^ -o $@

%.o: %.c
    gcc -c $< -o $@

但是,rule arule b类似,如果我有一个名为 c 的新程序,我必须编写另一条规则。

我可以在一条规则中将ab设为这样的事情:

$(TARGETS): $(OBJS) $(x.o)
    gcc -c $^ -o $@

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用secondary expansion,例如,

TARGETS := a b c

.SECONDEXPANSION:
$(TARGETS): $$@.o $(OBJS) 
    gcc $^ -o $@

主要好处是每个目标都可以拥有自己的.o文件列表。因此,如果稍后您需要为目标a添加更多.o文件,您可以执行类似

的操作
#Shared by all targets
COMMON_OBJS := foo.o bar.o baz.o

.SECONDEXPANSION:
#Used only for target a
a_OBJS := obj1.o obj2.o
$(TARGETS): $$@.o $$($$@_OBJS) $(COMMON_OBJS)

它仍可用于其他目标。

答案 1 :(得分:3)

您已经在使用模式规则来编译对象,为什么不使用它们来创建可执行文件呢?

%: %.o $(OBJS)
       gcc $^ -o $@

或者,如果您希望避免使用匹配任何模式规则,则可以使用静态模式规则:

$(TARGETS): %: %.o $(OBJS)
       gcc $^ -o $@

(二次扩张真的太过分了......)