2016-11-03 5 views
-2

これはそれほど大きな問題を与えるべきではありませんが、ワイルドカード演算子を使用してより効率的なmakefileを作成しようとしています。ファイルを作成し、リンクしてください。しかし、何らかの理由で、私はそれが私にこのを与える「作る」実行しようとするたびにために:複数の関数定義エラーMakefile?

undefined reference to main 
collect2: error: ld returned 1 exit status 

をけれどもこれらの前に:

multiple definition of 'ScreenMgr::ScreenMgr()' 
/path/to/ScrenMgr.cpp:4: first defined here 

、それもすぐに言う、この1の後に私に別のエラーが発生しますエラーが発生すると、私の.oが生成され、適切なディレクトリに配置されるので、エラーはリンカにある必要があります。誰かが助けてくれると思ったらC++ソースをインクルードすることができますが、ファイルは実際には空です(私はヘッダガードを入れていますが)。このような問題は、コードについても心配する必要はありません。この行は、それがからソースファイルのすべての任意のの.oファイルを作成することができmakeを告げる

+2

問題はあなたのMakefileではありません。あなたの問題はScreenMgr.cppまたはScreenMgr.hにあります –

+0

おそらく、ヘッダーファイルに適切なインクルードガードがありません。 – Barmar

+0

あるいは、 '.cpp'と' .h'の両方でコンストラクタを定義しているかもしれません。 – Barmar

答えて

1
$(BUILDIR)/%.o: $(SRCS) 

-MsSolver 
|--src 
| |--main.cpp 
| |--ScreenMgr.cpp 
|--include 
| |--ScreenMgr.h 
|--build #empty directory 
| 
|--Makefile 
|: 
|--bin 

、ここでのmakefileです:のようなディレクトリ構造が見えます。

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

そして、この行で、$<最初依存、$(SRCS)に即ちソースファイル、すなわちsrc/ScreenMgr.cppを意味します。

だから、基本的に、これはオブジェクトファイルを構築するんだろうしてください:それは実際には二つのリンクです、あなたはそれが正常に働いていると思うかもしれません.oファイルの名前に基づいて

$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/ScreenMgr.o 
$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/main.o 
$(CC) $(LFLAGS) $(INCLUDES) $(LIBS) build/ScreenMgr.o build/main.o -o bin/mssolver 

...しかし、それはありません」 ScreenMgr.cppの「コピー」し、main.cppをリンクしない!

に変更し、それを:代わりに

$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp