2010-04-02 261 views
0

我建立一個C項目,Xcode和當過我建立它,它給了我這個錯誤:GCC 4.2編譯錯誤

ld: duplicate symbol _detectLinux in /Users/markszymanski/Desktop/Programming/C/iTermOS/build/iTermOS.build/Debug/iTermOS.build/Objects-normal/i386/linuxDetect.o and /Users/markszymanski/Desktop/Programming/C/iTermOS/build/iTermOS.build/Debug/iTermOS.build/Objects-normal/i386/iTermOS.o

謝謝!

回答

1

這意味着您已定義與全局範圍的相同符號在(至少)兩個不同的源文件 - 無論是一個函數或被叫_detectLinux全局變量,並且顯然在文件linuxDetect.ciTermOS.c

如何解決這取決於你打算如何使用這個符號:如果你的意思是在一個文件中定義它,並在其他文件中使用它

  • ,聲明它extern中的其他文件。

  • 如果您只打算在聲明的文件中使用該符號,則可以聲明它爲static

  • 如果在兩個文件中都定義了符號,則可以在一個(或兩個)文件中重命名該符號。

+0

我將它聲明爲「靜態」,現在可以工作,謝謝! – 2010-04-02 13:25:00

0

那麼,這不是很多信息繼續下去。正如錯誤所述,符號_detectLinux包含在linuxDetect.o和iTermsOS.o中,並且當您嘗試將它們鏈接在一起時,由於鏈接器不知道要使用哪個符號,因此存在衝突。例如,如果你在.h文件中有一個具有該名稱的全局變量,而該文件用於構建兩個文件,而不是在一個地方聲明並在.h文件中聲明爲「extern」,則可能發生這種情況。

您需要做的是查看最初聲明符號_detectLinux的位置,然後通過linuxDetect.o和iTermOS.o的依賴關係進行跟蹤,以瞭解爲什麼將它們公開包含在兩者中。

1

如果_detectLinux是一個函數,解決此問題的一種常見方法是在頭文件中定義它,但忘記標記爲內聯。這會導致它在包含頭文件的每個文件(大概是_detectLinux.c和iTermsOS.c)中生成函數代碼。

或者,您可能在兩個源文件之間複製粘貼了函數的全部主體,而不是簡單地在iTermsOS.c中聲明函數,我期望它被調用。