2012-04-27 51 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()的定义,因此您需要检查是否写入了它们,如果是,则包含它们的对象文件是否构成链接的一部分。

如果您的链接器输出是详细的,它应该显示您正在链接哪些对象文件。