2011-12-20 3 views
3

В настоящее время у меня есть 2 C-программы и 1 файл заголовка, которые я должен внести в Makefile. Я новичок в компиляции программ в Make-файлы, но я знаю основы. Я печатаю:error - "(.text + 0x0): множественное определение« метод »(программа C)

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 

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

Спасибо,

EDIT: Спасибо за ответы. Что делать, если «метод» является «структурной» функцией? Будет ли еще хорошая идея просто переместить его в другое место? Я просто попробовал, и теперь я получаю «указатель разыменования до неполного типа».

+0

Я понял. Спасибо всем! – Ellea

ответ

3

«метод» определен в файле заголовка.

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

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

0

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

0

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

/// in header.h 
static inline int sum(int x, int y) { return x+y; } 
1

Сделайте свой заголовочный файл, как это (IfNDef, чтобы убедиться, что он не получает больше, чем когда-то в комплекте):

#ifndef MYHEADER_H_ 
#define MYHEADER_H_ 

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

#endif 
+0

Недопустимо определять макросы в вашей программе, содержащие двойной знак подчеркивания. –

+0

@Charles: Я предполагаю, что вы говорите о том, как двойные подчеркивания зарезервированы для предопределенных макросов? –

+0

Не обязательно для макросов, но как любой идентификатор, они зарезервированы для реализации во всех областях. –

Смежные вопросы