ошибка - "(.text + 0x0): множественное определение метода" (программа на C) - PullRequest
3 голосов
/ 20 декабря 2011

В настоящее время у меня есть 2 C-программы и 1 заголовочный файл, который я должен превратить в Makefile.Я новичок в компиляции программ в Makefiles, но я знаю основы.Я набираю:

cc -c file1.c

cc -c file2.c

cc file1.o file2.o

----- Я получаю следующую ошибку -----

file2.o: In function 'method':

file2.c:(.text+0x0): multiple definition of 'method'

file1.o:file1.c:(.text+0x0): first defined here

collect2: ld returned 1 exit status

В чем проблема?Я слышал разные вещи, например, потому что они имеют один и тот же заголовок («метод» определен в файле заголовка), который, по мнению компилятора, их два.Я не знаю.Что вы, ребята, думаете?

Спасибо,

РЕДАКТИРОВАТЬ: Спасибо за ответы.Что, если 'method' - это функция "struct"?Будет ли все еще хорошей идеей просто перенести его в другое место?Я только что попробовал, и теперь я получаю «разыменование указателя на неполный тип».

Ответы [ 5 ]

3 голосов
/ 20 декабря 2011

'метод' определен в заголовочном файле.

Ты не должен этого делать. Если вы сделаете это, определение функции войдет во все файлы, которые содержат заголовок, что вызывает ошибки компоновки, так как будет несколько версий метода.

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

1 голос
/ 20 декабря 2011

Создайте свой заголовочный файл следующим образом (ifndef должен убедиться, что он не включается более одного раза):

#ifndef MYHEADER_H_
#define MYHEADER_H_

extern void mymethod1(void); // only put declaration in headers
extern void mymethod2(void);
... other stuff

#endif
1 голос
/ 20 декабря 2011

Если method - это небольшая функция, определенная в заголовочном файле, вы должны объявить ее static inline, например, как

/// in header.h
static inline int sum(int x, int y) { return x+y; }
0 голосов
/ 20 декабря 2011

Объявить функцию как статическую функцию.

0 голосов
/ 20 декабря 2011

У вас есть определение метода в файлах file2.c и file1.c. Попробуйте поместить объявление только в общие заголовочные файлы и перенести определение только в один файл c.

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