2013-02-12 93 views
1

任何想法爲什麼這樣的東西不會在makefile中工作?構建makefile中的多個目標

all : $(GOAL_DB) $(GOAL) 

%.d: %.cpp  
    $(CC) $(CPPFLAGS_DB) $< > [email protected] 
%.o : %.cpp 
    $(CC) $(FLAGS_DB) $< -o [email protected] 

$(GOAL_DB) : $(OFILES) 
     $(CC) $(LFLAGS_DB) -o [email protected] $^ $(LIBS_DB) 
    strip $(GOAL_DB) 
    rm -f *.o *.d 

%.d: %.cpp  
    $(CC) $(CPPFLAGS) $< > [email protected] 
%.o : %.cpp 
    $(CC) $(FLAGS) $< -o [email protected] 
$(GOAL) : $(OFILES) 
     $(CC) $(LFLAGS) -o [email protected] $^ $(LIBS) 
    strip $(GOAL) 
    rm -f *.o *.d 

我只是試圖使用make all,GNU make來構建兩個不同的目標。

第一個目標生成良好,但它不爲另一個目標創建新的目標文件。

回答

3

makefile不像按順序執行的標準程序。看起來你已經假設在新目標出現之前出現的新規則將適用於該目標。不是這種情況。在開始應用規則之前,makefile會對變量,目標,依賴關係等進行全面評估。

Make會將這些$(OFILES)與這些%.d:目標中的一個匹配,這可能是它找到的第一個目標模式。

你沒有得到另一個目標的新對象的原因是爲了讓它看起來像你正在建造兩個相同的文件集,因此跳過了第二個構建,因爲它已經完成。

一個解決方案是使用 '目標的具體變量':

all : $(GOAL_DB) $(GOAL) 

$(GOAL): BUILD_FLAGS=$(FLAGS) 
$(GOAL): BUILD_CPPFLAGS=$(CPPFLAGS) 
$(GOAL): BUILD_OUTDIR=./outdir 
$(GOAL): $(OFILES) 

$(GOAL_DB): BUILD_FLAGS=$(FLAGS_DB) 
$(GOAL_DB): BUILD_CPPFLAGS=$(CPPFLAGS_DB) 
$(GOAL_DB): BUILD_OUTDIR=./outdir_db 
$(GOAL_DB): $(OFILES) 

%.d: %.cpp  
    mkdir -p $(BUILD_OUTDIR) 
    $(CC) $(BUILD_CPPFLAGS) $< > $(BUILD_OUTDIR)/[email protected] 

%.o : %.cpp 
    mkdir -p $(BUILD_OUTDIR) 
    $(CC) $(BUILD_FLAGS) $< -o $(BUILD_OUTDIR)/[email protected] 
+0

謝謝!是的,我假設一個連續的執行,這絕對不會發生。你的解決方案更有意義,但它並沒有創建兩個目標。 – dharag 2013-02-12 18:59:44

+0

它仍然不會爲另一個創建對象文件。我試圖建立相同的文件集,但它使用不同的庫,你認爲這可能是一個問題? – dharag 2013-02-12 19:00:41

+0

啊對。輸出文件仍然相同。生成文件應該設置爲輸出到單獨的目錄。 – PQuinn 2013-02-12 19:03:17