2017-02-14 78 views
0

鏈接輸入文件我嘗試編譯存儲在一個子目錄下生成對象的一個​​項目:Makefile文件 - 從文件夾

myproject: 
| 
src: .cpp, .cpp ... 
    | 
    release: .o, .o ... 

這裏的Makefile的一部分:

SRC  ?= src 
OBJ_PATH = $(SRC)/Release 
vpath %.o $(OBJ_PATH) 

... 

OBJS := $(addprefix $(OBJ_PATH)/,obj1.o obj2.o) 

all: build 

obj1.o: $(SRC)/Manager.cpp 
$(EXEC) $(CC) $(INCLUDES) $(CCFLAGS) $(GNCD_FLGS) -c $(<) -o $(OBJ_PATH)/[email protected] #-o [email protected] -c $< 

obj2.o: $(SRC)/Synth.cpp 
$(EXEC) $(CC) $(INCLUDES) $(CCFLAGS) $(GNCD_FLGS) $(DEFS) -c $(<) -o $(OBJ_PATH)/[email protected] #-o [email protected] -c $< 


myApp: obj1.o obj2.o 
$(EXEC) $(CC) $(LDFLAGS) $(GNCD_FLGS) -o [email protected] $(OBJS) $+ $(LIBS) 
$(EXEC) mkdir -p $(OBJ_PATH)/$(TRGT_ARCH)/$(TRGT_OS)/$(BLD_TP) 
$(EXEC) cp [email protected] $(OBJ_PATH)/$(TRGT_ARCH)/$(TRGT_OS)/$(BLD_TP) 

$(OBJECTS) : Stt.h 

build: myApp 

run: build 
$(EXEC) ./myApp 

..但我有一個錯誤的鏈接:

Could not open input file 'obj1.o' 
Makefile:86: recipe for target 'myApp' failed 

所以看起來在src/Release dir中找不到對象;

有什麼想法?

感謝的

+0

這是http://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different-directory-than-src的副本? –

+0

是的,這聽起來很有趣,但在我的情況下,我需要從項目源和外部庫創建對象。所以,我不知道得到這個語法能夠既對象鏈接.. – spin0

回答

0

您的對myApp配方使用$+,其中列出的先決條件。它擴大obj1.o obj2.o。但是你在$(OBJ_PATH)中構建obj1.o和obj2.o。所以鏈接器試圖找到根目錄中的對象,但找不到它們,因爲它們在$(OBJ_PATH)中。 因爲你的食譜明確地列出了他們(與$(OBJS)),你不需要自動變量。

旁註

根據保羅的第二次Makefile中的規則,它是最好的,每一個規則更新完全對應的目標名稱(包括路徑部分)的文件(換句話說,總是在使用[email protected]配方),以便始終知道哪些是更新的確切文件。 在你的情況,如果你想建立在OBJ_PATH的對象的文件,你可以使用的形式$(OBJ_PATH)/obj.o的每一個的規則。 您還可以通過$(OBJS)代替對myApp的依賴,並使用自動變量(順便說一句,有沒有你爲什麼喜歡$+超過$^(做同樣的事情,但做的先決條件列表中未水土保持通報重複)理由嗎?)。

+0

嗨VannTen,我修改,比如$(OBJ_PATH)/obj1.o:$(SRC)/Manager.cpp ......以及對myApp, $(EXEC)CP $ @ $(OBJ_PATH)/ $(TRGT_ARCH)成爲$(EXEC)CP $ @ $(TRGT_ARCH)/ ..謝謝對您的解釋:) – spin0