Multiple definition of main in Makefile

I’m trying to generate a file ppm2jpeg from my sources in ./src using my objects in ./obj and ./obj_prof. I also want to generate tests that I can execute independently in ./tests.

Here’s my Makefile in my main folder :

CC = gcc
LD = gcc


CFLAGS = -Wall -Wextra -std=c99 -Iinclude -Ofast -pg
LDFLAGS = -lm -pg


SRC_FILES=$(wildcard src/*.c)



OBJ_FILES=$(patsubst src/%.c,obj/%.o,$(SRC_FILES))

OBJ_PROF_FILES = obj_prof/htables_prof.o

all: ppm2jpeg tests

ppm2jpeg: $(OBJ_FILES) $(OBJ_PROF_FILES)
    $(LD) $(OBJ_FILES) $(OBJ_PROF_FILES) $(LDFLAGS) -o $@

tests: $(OBJ_FILES) $(OBJ_PROF_FILES)
    make -C tests/

obj/%.o: src/%.c
    $(CC) -c $(CFLAGS) $< -o $@


clean:
    rm -rf ppm2jpeg do_test $(OBJ_FILES)
    make -C tests/ clean
    rm -f $(wildcard images/*.bla)
    rm -f $(wildcard images/*.jpg)

And here’s my Makefile in ./tests:

CC = gcc
LD = gcc


CFLAGS = -Wall -Wextra -std=c99 -I../include -O0 -g
LDFLAGS = -lm -pg

OBJ_FILES = $(wildcard ../obj/*.o)
OBJ_PROF_FILES = ../obj_prof/htables_prof.o


SRC_TESTS = $(wildcard *-test.c)
OBJ_TESTS = $(patsubst %.c,%.o,$(SRC_TESTS))
TESTS = $(patsubst %-test.c,%-test,$(SRC_TESTS))

all: $(TESTS)

%-test: %-test.o
    $(CC) -g $(OBJ_FILES) $(OBJ_PROF_FILES) $(OBJ_TEST) $^ -o $@ $(LDFLAGS)

%-test.o: %-test.c
    $(CC) $(CFLAGS) -lm -c $^

clean:
    rm -rf *.o *~ $(TESTS)
CC = gcc
LD = gcc


CFLAGS = -Wall -Wextra -std=c99 -I../include -O0 -g
LDFLAGS = -lm -pg

OBJ_FILES = $(wildcard ../obj/*.o)
OBJ_PROF_FILES = ../obj_prof/htables_prof.o

# Fichiers de test
SRC_TESTS = $(wildcard *-test.c)
OBJ_TESTS = $(patsubst %.c,%.o,$(SRC_TESTS))
TESTS = $(patsubst %-test.c,%-test,$(SRC_TESTS))

all: $(TESTS)

%-test: %-test.o
    $(CC) -g $(OBJ_FILES) $(OBJ_PROF_FILES) $(OBJ_TEST) $^ -o $@ $(LDFLAGS)

%-test.o: %-test.c
    $(CC) $(CFLAGS) -lm -c $^

clean:
    rm -rf *.o *~ $(TESTS)
CC = gcc
LD = gcc


CFLAGS = -Wall -Wextra -std=c99 -I../include -O0 -g
LDFLAGS = -lm -pg

OBJ_FILES = $(wildcard ../obj/*.o)
OBJ_PROF_FILES = ../obj_prof/htables_prof.o

# Fichiers de test
SRC_TESTS = $(wildcard *-test.c)
OBJ_TESTS = $(patsubst %.c,%.o,$(SRC_TESTS))
TESTS = $(patsubst %-test.c,%-test,$(SRC_TESTS))

all: $(TESTS)

%-test: %-test.o
    $(CC) -g $(OBJ_FILES) $(OBJ_PROF_FILES) $(OBJ_TEST) $^ -o $@ $(LDFLAGS)

%-test.o: %-test.c
    $(CC) $(CFLAGS) -lm -c $^

clean:
    rm -rf *.o *~ $(TESTS)

When I try to do that

/tests/example-test.c:5: multiple definition of `main'; ../obj/ppm2jpeg.o:ppm2jpeg.c:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status

>Solution :

That error message means that you are trying to link together two object files each containing a main() function.

Analyzing the error message, I would guess both example-test.c and ppm2jpeg.c define main(), which means you should not link example-test.o and ppm2jpeg.o in the same executable.

In your Makefile, you should probably make sure OBJ_FILES only lists files that don’t define main(), so you should make sure it leaves out ppm2jpeg.o.

Leave a Reply