El error de referencia indefinido no tiene ningún sentido para mí
Frecuentes
Visto 1,906 veces
2
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 to
AStarPlanner::~AStarPlanner()'
6 Respuestas
4
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
2
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
1
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
1
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
0
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
-1
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 c++ cmake undefined-reference linkage or haz tu propia pregunta.
Probablemente no esté vinculando los dos archivos de objetos. Qué compilador estas usando? - Lee Netherton
Este es un error del enlazador, no un error del compilador. ¿Está vinculando con el archivo de objeto que contiene
AStarPlanner
s definiciones de funciones? - hmjdCreo que gcc y cmake en Ubuntu 10.04. - madmax