除了这个未定义的符号错误外,一切正常:
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
答案 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)
它看起来似乎RECTANGLE
和CIRCLE
缺少默认构造函数。
答案 4 :(得分:0)
你错过了一个图书馆。或者有一个破碎的工具链(取决于gcc的包含路径)。
谷歌蹲下来......所以澄清你实际上尝试构建的东西让我们帮助你更多:)