странная ошибка компоновщика при создании программы: 'множественное определение `fnames'; src / main.o :(. data.rel.local + 0x0): сначала определено здесь ' - PullRequest
0 голосов
/ 18 июня 2020

Итак, я программирую программу, которая настолько разрослась, что я решил создать много файлов для этого проекта (как я делал раньше). После создания 2 файлов и помещения в них соответствующих функций я получаю эти ошибки при создании.

/bin/ld: src/util.o:(.data.rel.local+0x0): multiple definition of `fnames'; src/main.o:(.data.rel.local+0x0): first defined here
/bin/ld: src/util.o:(.data+0x0): multiple definition of `gBoard'; src/main.o:(.data+0x0): first defined here
/bin/ld: src/possiblemoves.o:(.data.rel.local+0x0): multiple definition of `fnames'; src/main.o:(.data.rel.local+0x0): first defined here
/bin/ld: src/possiblemoves.o:(.data+0x0): multiple definition of `gBoard'; src/main.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [Makefile:22: vgcp] Error 1

Вот мой Makefile:

IDIR=/usr/include/SDL2
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=src

LIBS=-lSDL2 -lSDL2_image

_DEPS = main.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = main.o util.o possiblemoves.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

all: vgcp clean


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

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

.PHONY: clean

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

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Я решил проблему, просто просмотрев переполнение стека, чтобы узнать больше ... Итак, похоже, мне нужно использовать ключевое слово extern для моих переменных в файле заголовка. Я получил свое решение отсюда: (. Bss + 0x0): множественное определение прокси

0 голосов
/ 18 июня 2020

Похоже, что у вас есть переменные fnames и gBoard, определенные во всех файлах util.c, possiblemoves.c и main.c, как и пытается предложить компоновщик.

Определение должен оставаться только в одном из исходных файлов, в то время как вы можете поместить объявление для такой переменной в другие файлы, если вам нужно получить к ним доступ оттуда.

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