4

好的,我是 C++ 新手,所以我试图了解我可以从错误消息中获得哪些信息。

这是错误消息

架构 x86_64 的未定义符号:
  “PieceClothing::PieceClothing(int)”,引用自:
      ClothesInventory.o 中的 ClothesInventory::getPieceOfClothing(long)
      ClothesInventory.o 中的 ClothesInventory::insertIntocloset(std::basic_string, std::allocator >)
  “PieceClothing::PieceClothing()”,引用自:
      ClothesInventory.o 中的 ClothesInventory::ClothesInventory()
      ClothesInventory.o 中的 ClothesInventory::ClothesInventory(std::basic_string, std::allocator >)
      ClothesInventory.o 中的 std::map、std::allocator > >::operator[](long const&)
ld:未找到架构 x86_64 的符号
collect2: ld 返回 1 个退出状态

这是我的理解:
- 有两个错误;
- 与 getPieceOfClothing 和 insertIntocloset 相关的一个;
- 构造函数中的其他可能与我在那里的地图和/或迭代器有关。

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

谢谢你的帮助。

4

2 回答 2

5

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

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

他们说没有为他们找到任何符号。这通常是以下任一迹象:

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

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

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

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

它的工作原理可以分为两部分:

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

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

于 2012-04-27T10:59:02.530 回答
0

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

如果您的链接器输出很冗长,它应该向您显示正在链接的目标文件。

于 2012-04-27T11:18:29.343 回答