2017-02-14 12 views
0

からのリンク入力ファイル:のMakefile - 私はサブディレクトリに格納されて生成されたオブジェクトを使用してプロジェクトをコンパイルしようとするフォルダ

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

ここでのMakefileの一部です:私が得た..but

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ディレクトリにオブジェクトが見つかりませんでした。

て、myAppのための感謝の

+0

これはhttp://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different-directory-than-srcの複製ですか? –

+0

はい、それは興味深い音ですが、私の場合、私はプロジェクトのソースと外部のlibからオブジェクトを作成する必要があります。だから私は両方のオブジェクトをリンクすることができるこの構文を得るために確信していません。 – spin0

答えて

0

あなたのレシピは、前提条件をリスト$+を、使用しています。それはobj1.o obj2.oに拡張されます。しかし、$(OBJ_PATH)にobj1.oとobj2.oを作成します。したがって、リンカーはルートディレクトリのオブジェクトを見つけようとしますが、それは$(OBJ_PATH)にあるため、見つけられません。 レシピに明示的にリストされているので($(OBJS))、自動変数は必要ありません。言い換えれば

追記

のMakefileのパウロの第二法則によると、それはすべてのルールは、(パス部分を含む)ターゲット名に正確に対応するファイルを更新していることが最善です(常にで[email protected]を使用レシピ)を使用して、正確に更新されたファイルが常にわかるようにします。 OBJ_PATHにオブジェクトファイルを作成する場合は、それぞれに$(OBJ_PATH)/obj.oという形式のルールを使用できます。 また、myAppの依存関係を$(OBJS)に置き換えて、自動変数(btw、を$^よりも好む理由はありますか?同じことですが、前提条件リストにconserv重複はありませんか?

+0

こんにちはVannTen、私は$(OBJ_PATH)/obj1.oのように変更:$(SRC)/Manager.cpp ... myApp、 $(EXEC)cp $ @ $(OBJ_PATH)/ $(TRGT_ARCH)は$(EXEC)cp $ @ $(TRGT_ARCH)になります。 – spin0

関連する問題