Неустранимая ошибка в make-файле, необходимо понять проблему - PullRequest
0 голосов
/ 10 мая 2019

Мой make-файл выдает следующие сообщения об ошибках:

ma.c:(.text+0x5aa): multiple definition of `dividetoken'
obj/src/ag.o:ag.c:(.text+0x0): first defined here
obj/src/ma.o: In function `main':
ma.c:(.text+0x629): multiple definition of `main'
obj/src/ag.o:ag.c:(.text+0x6ef): first defined here
obj/src/cv.o: In function `readln':
cv.c:(.text+0xb2): multiple definition of `readln'
obj/src/ag.o:ag.c:(.text+0x7f): first defined here
obj/src/cv.o: In function `dividetoken':
cv.c:(.text+0x176): multiple definition of `dividetoken'
obj/src/ag.o:ag.c:(.text+0x0): first defined here
obj/src/cv.o: In function `main':
cv.c:(.text+0x1f5): multiple definition of `main'
obj/src/ag.o:ag.c:(.text+0x6ef): first defined here
obj/src/sv.o: In function `readln':
sv.c:(.text+0x0): multiple definition of `readln'
obj/src/ag.o:ag.c:(.text+0x7f): first defined here
obj/src/sv.o: In function `dividetoken':
sv.c:(.text+0x150): multiple definition of `dividetoken'
obj/src/ag.o:ag.c:(.text+0x0): first defined here
obj/src/sv.o: In function `main':
sv.c:(.text+0xcb5): multiple definition of `main'
obj/src/ag.o:ag.c:(.text+0x6ef): first defined here
collect2: error: ld returned 1 exit status
makefile:17: recipe for target 'program' failed
make: *** [program] Error 1

Что мне делать? Это может быть легко решено? Я не знаю что делать

Мой make-файл выглядит так:

ODIR = obj
IDIR = include
SDIR = src

CC = gcc
EXE = program

DEPS = $(IDIR)/$(wildcard*.h)
SOURCES = $(wildcard $(SDIR)/*.c)

OBJECTS = $(foreach o, $(patsubst %.c,%.o,$(SOURCES)), $(ODIR)/$o)

$(ODIR)/%.o : %.c $(DEPS)
    $(CC) -c -o $@ $< 

$(EXE): $(OBJECTS)
    $(CC) $(OBJECTS) -o $(EXE)

clean:
    rm $(ODIR)/$(SDIR)/*
    rm $(EXE)

Надеюсь, это поможет понять, в чем заключалась моя ошибка.

1 Ответ

2 голосов
/ 10 мая 2019

Ваш Makefile выглядит нормально - я не вижу проблем с ним как таковым [*]. Проблема в том, что ваш код компилируется.

Посмотрите на одну из ошибок, которые вы получаете:

obj / src / sv.o: в функции `main ':

sv.c :(. Text + 0xcb5): множественное определение `main '

obj / src / ag.o: ag.c :(. Text + 0x6ef): сначала определено здесь

То есть, у вас есть файл с именем "sv.c", в котором есть функция с именем main. И что у вас есть другой файл с именем «ag.c», в котором также есть функция с именем main. Вы пытаетесь скомпилировать оба этих файла в одну и ту же программу, но вам разрешено иметь только одну функцию с именем main.

[*] Похоже, у вас в каталоге "src" живет несколько программ, и ваш Makefile пытается собрать все в одну гигантскую программу. Если это так, вам нужно либо разделить код на свои собственные каталоги, либо изменить свой Makefile, чтобы в SOURCES отображались только исходные файлы, относящиеся к программе, которую вы компилируете.

Если вы хотите скомпилировать несколько программ в одном и том же Makefile, вам нужно разделить вещи. Каждая программа нуждается в собственном правиле сборки, которое определяет необходимые ей зависимости. Вы можете сгенерировать переменную OBJECTS для каждого из них таким же образом, но вам нужно будет перечислить файлы C, которые нужны каждой программе.

SOURCES1 = ag.c other.c something.c
SOURCES2 = sv.c morecode.c something.c

OBJECTS1 = $(foreach o, $(patsubst %.c,%.o,$(SOURCES1)), $(ODIR)/$o)
OBJECTS2 = $(foreach o, $(patsubst %.c,%.o,$(SOURCES2)), $(ODIR)/$o)

$(ODIR)/%.o : %.c $(DEPS)
    $(CC) -c -o $@ $< 

program1: $(OBJECTS1)
    $(CC) $^ -o $@

program2: $(OBJECTS2)
    $(CC) $^ -o $@

Для справки $^ означает все зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...