2014-01-17 54 views
1

我想有兩個不同的文件夾Makefile文件不會使所有目標

  1. dobjects編譯OBJ文件:凡對象具有調試符號(使用gcc的-g選項)
  2. sobjects:其中對象編譯時沒有調試符號。

源文件相同,

我有以下生成文件。

CC = gcc 
CFLAGS = -Wall 
OBJS = a.o b.o 
SRCS = a.c b.c 
SOBJS_DIR = sobjects 
DOBJS_DIR = dobjects 
SOBJS = $(addprefix $(SOBJS_DIR)/, $(OBJS)) 
DOBJS = $(addprefix $(DOBJS_DIR)/, $(OBJS)) 

all: release debug 

release: $(SOBJS) 

debug: $(DOBJS) 

$(DOBJS_DIR)/%.o: CFLAGS += -g 

$(DOBJS_DIR)/%.o $(SOBJS_DIR)/%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

clean: 
    rm dobjects/* 
    rm sobjects/* 

但每次我試圖「製造」只有一個目標是由時間。

$ make 
gcc -Wall -c a.c -o sobjects/a.o 
gcc -Wall -c b.c -o sobjects/b.o 

$ make 
gcc -Wall -g -c a.c -o dobjects/a.o 
gcc -Wall -g -c b.c -o dobjects/b.o 

任何幫助,將不勝感激

+0

附註(有一天你會明白這一點):「建立在他們都應該放在和使用'目錄文件VPATH'找到那些源文件「。 – Shahbaz

回答

4

此規則不去做你認爲它的作用:

$(DOBJS_DIR)/%.o $(SOBJS_DIR)/%.o: %.c 
     $(CC) $(CFLAGS) -c $< -o [email protected] 

模式與多個目標的規則告訴使得該配方的一個單一的調用將建立兩個目標。所以當make運行這個規則來構建$(DOBJS_DIR)/a.o時,make認爲$(SOBJS_DIR)/a.o也是被構建的,所以它不會嘗試運行規則來構建它。但是你的規則並沒有實際構建它,所以當你再次運行make時,它會看到該目標文件丟失,並再次運行上述規則,以構建丟失的規則。

你必須寫這兩個不同的規則:

$(DOBJS_DIR)/%.o: %.c 
     $(CC) $(CFLAGS) -c $< -o [email protected] 

$(SOBJS_DIR)/%.o: %.c 
     $(CC) $(CFLAGS) -c $< -o [email protected] 
+0

謝謝。我對於製作文件很陌生,直到現在,這段旅程並不令人愉快。 – user3207575