在我的工作目录中,我有一些名为foo.c
,bar.c
,baz.c
的文件,每个文件都定义了一些方法。我有两个名为a.c
和b.c
的文件。每个都是使用foo.c
,bar.c
和baz.c
中的方法的单个程序。我用下面的Makefile
a
和b
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 a
和rule b
类似,如果我有一个名为 c 的新程序,我必须编写另一条规则。
我可以在一条规则中将a
和b
设为这样的事情:
$(TARGETS): $(OBJS) $(x.o)
gcc -c $^ -o $@
感谢您的帮助。
答案 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 $@
(二次扩张真的太过分了......)