2014-10-27 32 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