了解“未定义的体系结构符号”错误

时间:2012-04-27 10:56:13

标签: c++

好的,我是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有关的一个;
- 构造函数中的其他可能是关于我在那里的地图和/或迭代器。

只是为了澄清,我没有附上代码,因为问题的关键是要理解我可以从消息中获得的所有信息。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

错误实际上与构造函数有关:

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

并且他们说没有为他们找到符号。这通常是以下两种情况的标志:

  • 他们没有实施
  • 它们已实现,但实现所在的文件未编译
  • 您从不与定义它们的模块链接的其他模块引用它们

错误列表中的其他详细信息仅说明调用构造函数的位置。例如,如果您有:

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

您正在引用构造函数,因为您尝试创建该类型的对象。

这如何运作可分为两部分:

1)编译器检查定义类的头文件,并查看默认构造函数是否可用。它找到了构造函数,因此它确定了它。

2)链接器开始运作。它查找与目标文件和引用库中的调用匹配的符号。这就是你出错的地方。

答案 1 :(得分:0)

该消息告诉您它找不到声明的构造函数PieceClothing::PieceClothing(int)PieceClothing::PieceClothing()的定义,因此您需要检查是否已编写它们,如果是,则检查目标文件是否为包含它们构成链接的一部分。

如果您的链接器输出是详细的,它应该显示正在链接的目标文件。