Multiple definitions of main with Makefile

Mertcan Ekiz picture Mertcan Ekiz · Aug 21, 2014 · Viewed 7.6k times · Source

I am trying to compile my C++ program using make and I've come across this problem that I can't quite understand. I have 3 files in the src folder of my project: App.h, App.cpp and main.cpp. I have my Makefile located in the root folder of my project, which has the src folder that I mentioned in it. This is what my Makefile looks like:

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)/*~ 

When I type make into the terminal to compile, I get an error like this:

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

But I am sure that I only have 1 main function, and it is in the main.cpp file. What is causing this?

Answer

rodrigo picture rodrigo · Aug 21, 2014

Look at these lines:

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

Those mean that main is defined both in main.o and App.o.

And above those:

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

See? Both object files are built using the same source!

You probably want to change this line for the object dependency:

%.o: %.c $(DEPS)