使用Makefile对main进行多次定义

时间:2014-08-21 17:37:09

标签: c++ makefile multiple-definition-error

我正在尝试使用make编译我的C ++程序,并且我遇到了这个我无法理解的问题。我项目的src文件夹中有3个文件:App.hApp.cppmain.cpp。我的Makefile位于我项目的根文件夹中,该文件夹中包含我提到的src文件夹。这就是我的Makefile的样子:

CC=g++
SRCDIR=./src
CFLAGS=-I$(SRCDIR)
LIBS=-lSDL -lGL
_DEPS=App.h
DEPS=$(patsubst %,$(SRCDIR)/%,$(_DEPS))
_OBJ=main.o App.o
OBJ=$(patsubst %,$(SRCDIR)/%,$(_OBJ))
_SRC=main.cpp App.cpp
SRC=$(patsubst %,$(SRCDIR)/%,$(_SRC))

%.o: $(SRC) $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

tetris: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

clean:
    rm -f $(SRCDIR)/*.o $(SRCDIR)/*~ 

当我在终端中键入make进行编译时,我收到如下错误:

g++ -c -o src/main.o src/main.cpp -I./src
g++ -c -o src/App.o src/main.cpp -I./src
g++ -o tetris src/main.o src/App.o -I./src -lSDL -lGL
src/App.o: In function `main':
main.cpp:(.text+0x0): multiple definition of `main'
src/main.o:main.cpp:(.text+0x0): first defined here
src/main.o: In function `main':
main.cpp:(.text+0x17): undefined reference to `App::App()'
main.cpp:(.text+0x23): undefined reference to `App::onExecute()'
src/App.o: In function `main':
main.cpp:(.text+0x17): undefined reference to `App::App()'
main.cpp:(.text+0x23): undefined reference to `App::onExecute()'
collect2: error: ld returned 1 exit status

但我确信我只有1个主要功能,它位于main.cpp文件中。造成这种情况的原因是什么?

2 个答案:

答案 0 :(得分:3)

查看编译行。

您正在main.cppmain.o同时编译App.o

您将所有源文件列为%.o模式的先决条件,并使用$<仅编译第一个(恰好是main.cpp在这种情况下。

您希望%.c代替$(SRC)

答案 1 :(得分:2)

看看以下几行:

src/main.o: In function `main':
src/App.o: In function `main':

这意味着mainmain.o都定义了App.o

以上:

g++ -c -o src/main.o src/main.cpp -I./src
g++ -c -o src/App.o src/main.cpp -I./src

请参阅?两个目标文件都使用相同的源构建!

您可能希望为对象依赖项更改此行:

%.o: %.c $(DEPS)