2017-08-11 5 views
0

私は様々なサブディレクトリに分散されたソースからなるプロジェクトを構築しようとしています。ここでメイクファイルからビルドするときのリンカエラー

Project root 
├───build 
└───src 
    │ main.cpp 
    │ 
    ├───ui 
    │  more files 
    │ 
    └───core 
      more files 

は私が使っているメイクファイルの関連する部分です:それはトラブルの主な機能が含まれているmain.oファイルを見つけることがあるので、おそらくundefined reference to WinMain

EXT  := cpp 

SRC_DIR := src/ui src src/core 
SOURCES := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.$(EXT))) 
OBJECTS := $(SOURCES:.$(EXT)=.o) 

BIN  := program 

$(BIN): $(OBJECTS) 
    $(LD) $(LDFLAGS) -mwindows $^ -o [email protected] $(LDLIBS) 

$(OBJECTS): $(SOURCES) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

これは、次のエラーメッセージになります。

すべてのオブジェクトファイルをbuildフォルダに移動すると、この問題が解決され、これを行うにはどうすればよいでしょうか?

+1

$(OBJECTS)ターゲットを削除するとうまくいくはずです。デフォルトのターゲットは '$(CXX)$(CXXFLAGS)-c -o $ @ $ <'を使用します。 – ssbssa

+0

@ssbssaうまく動作します。オブジェクトファイルも移動したいのであれば、明示的なルールが必要でしょうか? –

+1

私はあなたがこれを意味すると思います: 'objdir /%。o:%.cpp; $(CXX)$(CXXFLAGS)-c $ <-o $ @ ' – ssbssa

答えて

0

最初の問題はここにある:

$(OBJECTS): $(SOURCES) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

あなたはオブジェクトのすべてソースの前提条件を作りました。 $<は最初のソースを選択します。したがって、オブジェクトファイル(main.oを含む)をビルドしようとすると、リスト(src/ui/someFile.cpp)の最初のソースファイルがコンパイルされます。次に、いくつかの同一のオブジェクトファイル(名前が異なる)をリンクしようとします。欠けているものがたくさんあります。

vpathを参照し、別のディレクトリにあるソースファイルを使用する方法については、このサイトのその他の質問に使用してください。そして、はい、すべてのオブジェクトファイルを1つのディレクトリに入れてください(例:objects/)。

より深刻な問題は、あなたが小さく始まらなかったことです。あなたは、コマンドが間違っていることに気づき、という攻撃を受けて、単一のオブジェクトファイルを構築しようとしているはずです。に問題があります。

+0

以前はmakefileを作っていましたが、別のディレクトリにソースコードを整理する必要がありました。あなたは正しかった、私はおそらく私が噛むことができる以上にビットオフ。 –

関連する問題