未定义的符号。ld: 找不到符号

4
除了这个未定义符号错误,一切正常运行:
bash-3.2$ make
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o Worl.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem

`Undefined symbols:
  "Obstacle::~Obstacle()", referenced from:
      Myworld::~Myworld()in Myworld.o
      Myworld::~Myworld()in Myworld.o
      Myworld::~Myworld()in Myworld.o
  "RECTANGLE::RECTANGLE()", referenced from:
      Myworld::readObstacles(std::basic_istream<char, std::char_traits<char> >&
in Myworld.o
  "CIRCLE::CIRCLE()", referenced from:
      Myworld::readObstacles(std::basic_istream<char, std::char_traits<char> >&
in Myworld.o
  "typeinfo for Obstacle", referenced from:
      typeinfo for RECTANGLEin RECTANGLE.o
      typeinfo for CIRCLEin CIRCLE.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [solvePlanningProblem] Error 1`

这是一个很奇怪的错误。构造函数或析构函数有问题吗? 任何建议都会有所帮助。

在所有构造函数和析构函数后添加{}之后,错误已经减少到:

Undefined symbols:

  "vtable for Obstacle", referenced from:
      Obstacle::Obstacle()in Myworld.o
  "typeinfo for Obstacle", referenced from:
      typeinfo for RECTANGLEin RECTANGLE.o
      typeinfo for CIRCLEin CIRCLE.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

1
没有看到任何代码,很难回答这个问题。你提供了这些析构函数的实现吗? - Konrad Rudolph
析构函数的实现是什么? 我在 ~Obstacle() 中什么也没做。 - Lisa
我认为他正在尝试编译一些需要自定义库的东西,但是gcc无法找到它(或者构建它),原因不明,而且构建在不适当的时候没有中断。 - Tim Post
.cpp文件的编译命令是什么?看起来在编译.o文件时,您已关闭了typeinfo,但在构建最终的exe时却没有。您的编译命令中是否包含“no-rtti”? - Zanson
5个回答

11
链接器找不到Obstacle类的析构函数。
它在另一个对象文件中吗(可能是Obstacle.o)?如果是这样,请将其添加到链接的对象列表中。
它应该是类定义中的一个空虚析构函数吗?在这种情况下,请确保你已经写了:
virtual ~Obstacle() {}

而不是

virtual ~Obstacle();
第一个实现了析构函数;第二个声明它存在,但在其他地方实现。

我在代码中添加了 {},错误减少到 "typeinfo for Obstacle",引用自:RECTANGLE.o 中的 RECTANGLE 的 typeinfo,CIRCLE.o 中的 CIRCLE 的 typeinfo ld: 找不到符号 collect2: ld 返回 1 退出状态 make: - Lisa
请查看我对你其他问题的回答。 - Mike Seymour
这是一个非常相关的观点。我花了几个小时来追踪一个“vtable中未找到符号”的链接错误,该错误出现在一个模板类的方法中,而该方法在头文件中被定义 - 实例化的类/方法没有被编译是不可能的。该类还继承自父类。直到我声明析构函数为虚拟的(即使它们的主体为空),这个错误才被修复。 - Jerry

1

可能是您声明了D'tor但没有实现它。尝试在.h文件中放置{},或者:

Obstacle::~Obstacle()
{
}

在 C++ 中。


"typeinfo for Obstacle" 的实际含义是什么?"vtable for Obstacle" 又是什么意思? - Lisa
Lisa,这些消息涉及虚拟化。vtable是指“虚拟表”,它是一个表格,保存了继承树中对象的函数地址,以便知道要去哪个实现(因为有重写等情况)。 请看这里: http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/ 也许如果您在此嵌入您的代码,我可以更有帮助。 - Gal Goldman
你可能有另一个虚方法,它既没有在基类中实现,也没有在其派生类中实现。 我会检查你的类中未实现的方法,可能是在Obstacle及其派生类中。 - Gal Goldman

1

看起来你缺少析构函数~Obstacle的实现,但它已经被定义了。

LD是链接器,这意味着一切都编译得很好,但当它开始将二进制文件链接成一个时,它找不到你代码中使用的Obstacle的析构函数。

添加:

~Obstacle() {}

在你的类定义中,可以在.h文件中定义它,或者如果你喜欢,只需将其定义为~Obstacle(),并在.cpp文件中提供实现,如~Obstacle::Obstacle()


你能告诉我如何进行销毁吗? Obstacle类是具有两个子类CIRCLE和RECTANGLE的基类。 - Lisa
好的,您应该在您的基类中使用虚析构函数,并在子类中实现它。您能否编辑您的问题并添加代码?那会很有帮助的。 - Jack
我已经在Obstacle.h中有了~Obstacle();。但问题仍然存在。 - Lisa
你在子类中也有它吗? - Jack

0

同时看起来RECTANGLECIRCLE缺少默认构造函数。


两个.h文件中都有RECTANGLE和CIRCLE。你说的“missing”是什么意思? - Lisa
它说“RECTANGLE::RECTANGLE”丢失。那是构造函数,而不是析构函数。CIRCLE也是如此。 - Mike Dunlavey
如上所述,所有构造函数和析构函数都已被修改,并且错误已经减少到两个问题。 - Lisa

0

您缺少一個庫,或者有損壞的工具鏈(這取決於gcc的包含路徑)。

Google沒有結果,因此澄清您實際上正在嘗試構建的內容可以讓我們更好地幫助您 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接