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

时间:2009-11-07 15:52:53

标签: c++ linux linker

除了这个未定义的符号错误外,一切正常:

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

5 个答案:

答案 0 :(得分:10)

链接器无法找到Obstacle类的析构函数。

是否在另一个目标文件(也许是Obstacle.o)中?如果是这样,请将其添加到要链接的对象列表中。

它应该是类定义中的空虚拟析构函数吗?在这种情况下,请确保您已经写过

virtual ~Obstacle() {}

而不是

virtual ~Obstacle();

第一个实现析构函数;第二个声明它存在,但是在其他地方实现。

答案 1 :(得分:1)

好像你错过了无论如何定义的析构函数~Obstacle的实现。

LD是链接器,这意味着所有内容编译都很好,但是当它开始将二进制文件链接到一个时,它无法找到代码中使用的Obstacle的析构函数。

添加

~Obstacle() {}

.h文件中的班级定义,或者如果您只是定义它~Obstacle()并在.cpp文件中提供~Obstacle::Obstacle()

答案 2 :(得分:1)

可能是你宣布了D'tor但没有实现它。尝试将{}放在.h文件中,或者:

Obstacle::~Obstacle()
{
}

在cpp。

答案 3 :(得分:0)

它看起来似乎RECTANGLECIRCLE缺少默认构造函数。

答案 4 :(得分:0)

你错过了一个图书馆。或者有一个破碎的工具链(取决于gcc的包含路径)。

谷歌蹲下来......所以澄清你实际上尝试构建的东西让我们帮助你更多:)