2011-12-20 31 views
3

我現在有2 C-方案和1個文件,我有使成生成文件。我是將程序編譯爲Makefiles的新手,但我知道基礎知識。我輸入:錯誤 - 「(的.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 

問題是什麼?我聽到過很多類似的東西,因爲它們共享相同的頭文件('頭文件'中定義了'method'),編譯器認爲它們中有兩個頭文件。我不知道。你們有什麼感想?

謝謝

編輯: 感謝您的答覆。如果'方法'是一個「結構」函數呢?把它移到別的地方還是個好主意嗎?我剛剛嘗試過,現在我得到一個「取消引用指向不完整類型的指針」。

+0

我明白了。謝謝大家! – Ellea 2011-12-20 07:03:32

回答

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

在包含雙下劃線的程序中定義宏是無效的。 – 2011-12-20 06:57:24

+0

@Charles:我假設你在談論如何爲預定義的宏保留雙下劃線? – 2011-12-20 07:02:53

+0

不一定用於宏,但作爲任何標識符,它們被保留用於所有作用域中的實現。 – 2011-12-20 07:06:06