2015-10-14 88 views
2

我試圖編譯兩個不同的文件集合的單個makefile文件。這是可行的嗎?makefile特定於目標的文件

我試了一下,到目前爲止是:

target1: OBJ = foo1.o foo2.o 
target1: application 

target2: OBJ = foo3.o foo4.o 
target2: application 

application: $(OBJ) 
    $(LD) $(OBJ) 

什麼情況是,LD被稱爲使用正確的參數,但要永遠不會實際檢查因此依賴關係編譯.c文件到.O是從來沒有的隱含規則執行連接器失敗:

ld: cannot find foo1.o: No such file or directory 
ld: cannot find foo2.o: No such file or directory 

什麼是正確的方法來做到這一點?

+0

你是對的。更正了產生錯誤的最小代碼 – felknight

+0

特定於目標的變量在*配方*中可用並且在同一目標的其他特定於目標的分配中可用。但是它們在先決條件中不可用(因爲它們可能依賴於直到確定先決條件才具有價值的自動變量)。也許有辦法做到這一點,但似乎傳統的明確的前提風格更簡單。也就是說,如果你從'target1:OBJ = foo1.o foo2.o'中刪除了'OBJ =',你最終會得到同樣可維護的'target1:foo1.o foo2.o'。 :) – rici

+0

@EtanReisner:是什麼讓你認爲它有先決條件?我用makefile測試了這個:'target:prereq = foo'' target:$(prereq)''\ techo $ ^'。如果目標特定變量在先決條件中可用,我希望看到'foo'。但不是。 (無先決條件的目標食譜是無條件執行的,不是?) – rici

回答

0

你可以用這個去實例(考慮到你不會打電話讓與多個目標同時):

OBJ := foo1.o foo2.o 

ifeq "$(MAKECMDGOALS)" "target2" 
OBJ := foo3.o foo4.o 
endif 

target1 target2: application 

application: $(OBJ) 
    $(LD) $^ 
+0

感謝您的回答。 – felknight

相關問題