2008-11-17 31 views
1

我有一個項目由兩個文件main.c和logoff.c組成。當我嘗試編譯他們,我得到這個錯誤:有關重複符號的奇怪ld錯誤

gcc -c -g -Wall main.c 
gcc -c -g -Wall logoff.c 
gcc -o main -g -Wall main.o logoff.o 
ld: duplicate symbol _logoff in logoff.o and main.o

我有一個在logoff.c註銷命名功能,但我已搜查main.c中的文本「註銷」,並沒有發現任何(該功能甚至沒有叫!)。

如果我將函數的名稱更改爲log_off,它就可以工作。在文件中還有第二個函數,它會導致相同的錯誤,除非其名稱也被更改。

這有可能會發生嗎?我在兩個不同的系統上有這個問題。有一件事可能是相關的,那就是我在另一個項目中使用了相同的logoff.c文件,但它沒有連接到這個文件。

+0

出於好奇,你是否將#include logoff.c放入main.c中? – 2008-11-17 22:18:58

+0

那是你的問題。將聲明移動到像logoff.h這樣的頭文件,它會很好地編譯。 – 2008-11-17 23:20:13

回答

2

只註銷的函數聲明創建logoff.h文件,像

void logoff(void);

然後,在main.c中與#include "logoff.h"包括它。不要包含logoff.c,因爲編譯器會編譯這個函數兩次,然後鏈接器會看到這個名字的兩個函數。

如果將其更改爲log_off,然後僅重新編譯其中一個,它似乎可行。另一個對象文件仍然具有編譯的舊註銷函數。因此,鏈接器會看到一個log_off和一個註銷。這就是它以這個名字爲你工作的原因。

2

你是否在main.c中包含或#import logoff.c?

你沒有 - 那是你的問題。 log.c包含在main.c中,所以main定義了_logoff和_main。現在你也編譯logoff.c,它定義了_logoff。然後,您嘗試鏈接這兩個鏈接,這意味着生成的二進制文件包含符號_main,_logoff和_logoff,鏈接器正告訴您這些符號。