El error de referencia indefinido no tiene ningún sentido para mí

Tengo este código aquí:
Principal.cpp

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

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

y mi clase:
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;
}

No puedo ver ningún error de mí. La función está definida y mi main.cpp conoce la clase.

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)

Pero me sale este error:
referencia indefinida a vtable for AStarPlanner'** ** undefined reference toAStarPlanner::~AStarPlanner()'

preguntado el 22 de mayo de 12 a las 17:05

Probablemente no esté vinculando los dos archivos de objetos. Qué compilador estas usando? -

Este es un error del enlazador, no un error del compilador. ¿Está vinculando con el archivo de objeto que contiene AStarPlanners definiciones de funciones? -

Creo que gcc y cmake en Ubuntu 10.04. -

6 Respuestas

No ha podido definir un destructor para AStarPlanner. Puede agregarlo a AStarPlanner.cpp así:

AStarPlanner::~AStarPlanner()
{
}

Imagine este consejo.

contestado el 22 de mayo de 12 a las 17:05

¿No debería estar bien: virtual ~AStarPlanner(); ? - Mad Max

No, eso es una declaración. También debe proporcionar una definición. Puede ser tan simple como virtual ~AStarPlanner() {}. - Robᵩ

También tuve un problema de referencia indefinida, que la mayoría de las veces indica un problema de vinculación ...

Lo resolví:

Similar a lo que escribió Lee Netherton, pero agréguelo directamente en su CmakeLists.txt

Asegúrese de agregar el archivo en el que se encuentra la implementación de la función que falla.

En tu ejemplo, asegúrate de que:

 add_executable(robot_mover 
                src/main.cpp
                AStarPlanner.cpp)

Eso le dirá al enlazador qué archivos fuente buscar todas las definiciones/implementaciones contra su ejecutable robot_mover...

Respondido 14 Feb 16, 06:02

El error significa que aunque el compilador podría encontrar la definición de la clase para main(), pero el enlazador no podía. Debe configurar sus opciones de compilación para que yopu pase el generado AStarPlanner.obj al enlazador cuando intenta construir su ejecutable

La forma exacta de cómo realizar la configuración depende del compilador que esté utilizando.

contestado el 22 de mayo de 12 a las 17:05

También lo hace la extensión del archivo objeto. - james mclaughlin

Con gcc debe ser compilado con algo como:

gcc -o main Main.cpp AStarPlanner.cpp

Supongo que te has perdido la AStarPlanner.cpp parte.

Edit:

¿Hugh? El error que está recibiendo acaba de cambiar en el OP. Esta respuesta no tendrá mucho sentido ahora.

Edit2:

Parece que estás poniendo AStarLibrary en un robot_mover Biblioteca. ¿Está vinculando a esta biblioteca al construir su ejecutable? no estoy familiarizado con el ros* macros, pero en gcc ordinario, el comando de compilación se vería así:

gcc -o main Main.cpp -lrobot_mover

contestado el 22 de mayo de 12 a las 17:05

je lo siento, busqué en mi cmakelist y encontré un error. Entonces no se resolvió pero el error cambió;) - Mad Max

Bueno, creo que la vinculación ocurre en CMakeList porque para compilar solo necesito llamar a rosmake. - Mad Max

¡Sí, @Robᵩ tiene razón! Y para completar, el nombre robot_mover es un paquete en el sistema operativo robótico. - Mad Max

AStarPlanner.cpp probablemente no se esté compilando/vinculando. Asegúrate de que esté en el proyecto.

contestado el 22 de mayo de 12 a las 17:05

Tus

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

hace referencia a costmap pero no veo una definición (para la variable en sí, no para la clase).

contestado el 22 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.