Issue
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
.
Answered By - joanis Answer Checked By - Cary Denson (WPSolving Admin)