好的,我是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 :(得分:5)
错误实际上与构造函数有关:
PieceClothing::PieceClothing(int)
PieceClothing::PieceClothing()
并且他们说没有为他们找到符号。这通常是以下两种情况的标志:
错误列表中的其他详细信息仅说明调用构造函数的位置。例如,如果您有:
ClothesInventory::getPieceOfClothing(long)
{
PieceClothing p;
}
您正在引用构造函数,因为您尝试创建该类型的对象。
这如何运作可分为两部分:
1)编译器检查定义类的头文件,并查看默认构造函数是否可用。它找到了构造函数,因此它确定了它。
2)链接器开始运作。它查找与目标文件和引用库中的调用匹配的符号。这就是你出错的地方。
答案 1 :(得分:0)
该消息告诉您它找不到声明的构造函数PieceClothing::PieceClothing(int)
和PieceClothing::PieceClothing()
的定义,因此您需要检查是否已编写它们,如果是,则检查目标文件是否为包含它们构成链接的一部分。
如果您的链接器输出是详细的,它应该显示正在链接的目标文件。