未定义的引用错误对我没有任何意义

时间:2012-05-22 16:09:30

标签: c++ cmake undefined-reference linkage

我这里有这个代码:
Main.cpp的

#include "AStarPlanner.h"
#include <costmap_2d/costmap_2d.h>

int main(int argc, char** argv)
{
   AStarPlanner planner =  AStarPlanner(10,10,&costmap);
}

和我的班级:
AStarPlanner.h

class AStarPlanner {

public:

  AStarPlanner(int width, int height, const costmap_2d::Costmap2D* costmap);
  virtual ~AStarPlanner();

AStarPlanner.cpp

#include "AStarPlanner.h"

using namespace std;

AStarPlanner::AStarPlanner(int width, int height, const costmap_2d::Costmap2D* costmap)
{

  ROS_INFO("Planner Konstruktor");
  width_ = width;
  height_ = height;
  costmap_ = costmap;
}

我看不出任何错误。函数已定义,我的main.cpp知道该类。

CMakeList

cmake_minimum_required(VERSION 2.4.6)
include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)

rosbuild_init()

#set the default path for built executables to the "bin" directory
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#set the default path for built libraries to the "lib" directory
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

rosbuild_add_library (robot_mover src/AStarPlanner.cpp )
rosbuild_add_executable(robot_mover src/main.cpp)

但是我得到了这个错误:
未明确引用vtable for AStarPlanner'** ** undefined reference to AStarPlanner :: ~AStarPlanner()'

6 个答案:

答案 0 :(得分:4)

您无法为AStarPlanner定义析构函数。您可以将它添加到AStarPlanner.cpp中:

AStarPlanner::~AStarPlanner()
{
}

考虑this advice

答案 1 :(得分:2)

我也有一个未定义引用的问题,大部分时间表示链接问题...

我解决了这个问题:

与Lee Netherton所写的相似,但直接将其添加到您的CmakeLists.txt

确保添加失败函数的实现所在的文件。

在您的示例中,请确保:

myRouter='\x00\x13\xA2\x00\x40\xE4\x29\xB3'
#For Off
xbee.remote_at(dest_addr_long=myRouter,command='D0',parameter='\x04')
#For switch ON
xbee.remote_at(dest_addr_long=myRouter,command='D0',parameter='\x05')

这将告诉链接器哪些源文件针对您的robot_mover可执行文件查找所有定义/实现...

答案 2 :(得分:1)

错误意味着虽然编译器可以找到main()类的定义,但链接器不能。您需要设置编译选项,以便yopu在尝试构建可执行文件时将生成的AStarPlanner.obj传递给链接器

如何进行设置的确切形式取决于您使用的编译器。

答案 3 :(得分:1)

使用gcc时,应使用以下内容进行编译:

gcc -o main Main.cpp AStarPlanner.cpp

我的猜测是你错过了AStarPlanner.cpp部分。

修改

休?您刚刚在OP中更改了错误。这个答案现在没有多大意义。

<强> EDIT2:

看起来您正在将AStarLibrary放入robot_mover库中。在构建可执行文件时是否链接到此库?我不熟悉ros*宏,但在普通的gcc中,build命令看起来像这样:

gcc -o main Main.cpp -lrobot_mover

答案 4 :(得分:0)

AStarPlanner.cpp可能没有被编译/链接。确保它在项目中。

答案 5 :(得分:-1)

AStarPlanner planner =  AStarPlanner(10,10,&costmap);

引用costmap但我没有看到它的定义(对于变量本身,而不是对于类)。