2014-10-27 63 views
2

在我的工作目录中,我有一些名为foo.c,bar.c,baz.c的文件,每个文件都定义了一些方法。我有两个文件叫a.cb.c。每个程序都是使用foo.c,bar.cbaz.c中的方法的单个程序。我编译ab下面的Makefile如何在一个规则中制作多个目标

TARGETS := a b 

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

all: $(TARGETS) 

a: a.o $(OBJS) 
    gcc $^ -o [email protected] 

b: b.o $(OBJS) 
    gcc $^ -o [email protected] 

%.o: %.c 
    gcc -c $< -o [email protected] 

然而,rule arule b是类似的,如果我有一个名为ç新节目,我必须写一个又一个规则。

所以我可以在一个规则出头的ab这样的:

$(TARGETS): $(OBJS) $(x.o) 
    gcc -c $^ -o [email protected] 

感谢您的帮助。

回答

3

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

%: %.o $(OBJS) 
     gcc $^ -o [email protected] 

或者如果你喜欢,以避免比赛任何模式规则,你可以使用静态模式规则:

$(TARGETS): %: %.o $(OBJS) 
     gcc $^ -o [email protected] 

(二次扩张确实是矫枉过正这...)

3

你可以使用secondary expansion,例如,

TARGETS := a b c 

.SECONDEXPANSION: 
$(TARGETS): [email protected] $(OBJS) 
    gcc $^ -o [email protected] 

主要好处是,每个目标都可以有自己的.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): [email protected] $$([email protected]_OBJS) $(COMMON_OBJS) 

,它仍然会为其他目标做出努力。

+0

当我尝试这个方法,它不会链接'TARGET.o'。 – akawhy 2014-10-28 01:29:59

+0

@akawhy感谢您指出。现在它应该工作。 – downhillFromHere 2014-10-28 11:11:06