2012-04-27 50 views
3

好吧,我是新來的C++,所以我想了解什麼信息可以從錯誤消息中獲得。瞭解「未定義的架構符號」錯誤

以下是錯誤消息

 
Undefined symbols for architecture x86_64: 
    "PieceClothing::PieceClothing(int)", referenced from: 
     ClothesInventory::getPieceOfClothing(long) in ClothesInventory.o 
     ClothesInventory::insertIntocloset(std::basic_string, std::allocator >)in ClothesInventory.o 
    "PieceClothing::PieceClothing()", referenced from: 
     ClothesInventory::ClothesInventory()in ClothesInventory.o 
     ClothesInventory::ClothesInventory(std::basic_string, std::allocator >)in ClothesInventory.o 
     std::map, std::allocator > >::operator[](long const&)in ClothesInventory.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

這裏是我的理解:
- 有兩種錯誤;
- 一個與getPieceOfClothing和insertIntocloset有關的事情;
- 其他在構造函數中可能是關於我在那裏的地圖和/或迭代器。

只是爲了澄清,我沒有附上代碼,因爲問題的關鍵是要了解我能從信息中得到的所有信息。

感謝您的任何幫助。

+0

'for architecture' - 您是否正在使用可能一次鏈接多個體繫結構的工具鏈,例如: Mac連接x64和PPC?我認爲這是一個紅鯡魚 - 它只是告訴你,它無法找到PieceClothing構造函數的實現 - 你是否明確實現了這些?你是否確實將它們連接起來? – Rup 2012-04-27 11:00:23

回答

5

的錯誤實際上是對構造函數:

PieceClothing::PieceClothing(int) 
PieceClothing::PieceClothing() 

和他們說發現他們沒有符號。這通常是任一個徵兆:

  • 他們沒有實現
  • 他們正在實施,但在實施在於未編譯
  • 你從不同的模塊中引用它們的文件不與定義它們的模塊鏈接

錯誤列表中的其他詳細信息只是說明調用構造函數的位置。例如,如果您有:

ClothesInventory::getPieceOfClothing(long) 
{ 
    PieceClothing p; 
} 

您引用構造函數是因爲您嘗試創建該類型的對象。

如何工作可以分爲兩部分進行細分:

1)編譯器檢查定義類,看到一個默認的構造函數是否可用頭文件。它找到了構造函數,這樣就可以了。

2)鏈接器開始生效。它會查找與對象文件和引用庫中的調用相匹配的符號。這是你出錯的地方。

+1

也可能:*它們所在的目標文件是爲不是x86_64的體系結構而構建的。 – Mat 2012-04-27 11:00:37

0

該消息告訴你,它找不到聲明的構造函數PieceClothing::PieceClothing(int)PieceClothing::PieceClothing()的定義,因此您需要檢查是否寫入了它們,如果是,則包含它們的對象文件是否構成鏈接的一部分。

如果您的鏈接器輸出是詳細的,它應該顯示您正在鏈接哪些對象文件。

相關問題