ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question
0

Catkin/Ros “undefined reference to”

asked 2016-06-01 12:45:09 -0500

sumperfees gravatar image

updated 2016-06-02 06:48:12 -0500

I'm trying to build a project with ROS, but I keep getting "undefined reference to <<class::function>>" errors, for exemple :



    CMakeFiles/robot_controller_node.dir/src/Node_Robot_Controller.cpp.o: dans la fonction « main »:
    Node_Robot_Controller.cpp:(.text+0x1f1): référence indéfinie vers « trajectoryclass::trajectoryclass(ros::NodeHandle) »
    Node_Robot_Controller.cpp:(.text+0x796): référence indéfinie vers « List_Container<task_interface>::getElement(int) »
    Node_Robot_Controller.cpp:(.text+0x7ab): référence indéfinie vers « Task_Interface::getTaskDescription() »
    Node_Robot_Controller.cpp:(.text+0x7d1): référence indéfinie vers « List_Container<task_interface>::getElement(int) »
    Node_Robot_Controller.cpp:(.text+0x7d9): référence indéfinie vers « Task_Interface::getTaskId() »
    Node_Robot_Controller.cpp:(.text+0x83a): référence indéfinie vers « List_Container<task_interface>::getElement(int) »
    Node_Robot_Controller.cpp:(.text+0x977): référence indéfinie vers « List_Container<task_interface>::next() »
    Node_Robot_Controller.cpp:(.text+0xa60): référence indéfinie vers « List_Container<task_interface>::getElement(int) »
    Node_Robot_Controller.cpp:(.text+0xa68): référence indéfinie vers « Task_Interface::getTaskId() »
    Node_Robot_Controller.cpp:(.text+0xab5): référence indéfinie vers « List_Container<task_interface>::getElement(int) »
    Node_Robot_Controller.cpp:(.text+0xadd): référence indéfinie vers « List_Container<task_interface>::isEmpty() »
    /home/tcozic/Documents/git_ur10/catkin_ws/devel/lib/librobot_controller_library.so: référence indéfinie vers « error_norm(std::vector<double, std::allocator<double=""> >, std::vector<double, std::allocator<double=""> >) »
    /home/tcozic/Documents/git_ur10/catkin_ws/devel/lib/librobot_controller_library.so: référence indéfinie vers « Position_Joint::getVector() »
    collect2: error: ld returned 1 exit status
    make[2]: *** [/home/tcozic/Documents/git_ur10/catkin_ws/devel/lib/ur10/robot_controller_node] Erreur 1
    make[1]: *** [ur10/CMakeFiles/robot_controller_node.dir/all] Erreur 2
    make: *** [all] Erreur 2
    Invoking "make install -j4 -l4" failed

This is my CmakeLists.txt for the compilation of this package :

<pre><code>
cmake_minimum_required(VERSION 2.8.3)
project(ur10)

set(MSG_DEPS
  std_msgs
  sensor_msgs
  geometry_msgs
  trajectory_msgs
  moveit_msgs
)


find_package(catkin REQUIRED COMPONENTS
  message_generation
  moveit_core
  moveit_ros_planning
  moveit_ros_planning_interface
  dynamic_reconfigure
  moveit_ros_move_group
  pcl_conversions ##adding
  pcl_msgs ##adding
  roscpp
  rospy
  roslib
  #tf
  #urdf
  genmsg
 ${MSG_DEPS}
)




find_package(VISP REQUIRED)
find_library(VISP_LIBRARIES NAMES visp HINTS ${VISP_LIBRARY_DIRS} )

find_package(PCL REQUIRED)
find_package(OpenCV REQUIRED)

find_package( ur_package REQUIRED)

## Generate messages in the 'msg' folder
 add_message_files(
   FILES
   Task_move.msg
   Task_wait.msg
   Piece.msg
   Task.msg
   Task_tool.msg
 )
# Generate services in the 'srv' folder
 add_service_files(
   FILES
   Validation.srv
   NewPiece.srv
 )

## Generate added messages and services with any dependencies listed here
 generate_messages(
   DEPENDENCIES
   std_msgs  # Or other packages containing msgs
 )
catkin_package(
  INCLUDE_DIRS include
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS message_runtime roscpp rospy roslib moveit_core moveit_ros_planning_interface   #moveit_plan_execution
 moveit_trajectory_execution_manager moveit_ros_planning  moveit_planning_scene_monitor ${MSG_DEPS}
  DEPENDS VISP OpenCV
)


###########
## Build ##
###########


include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "-std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "-std=c++0x")
else()
    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler. Suggested solution: update the pkg build-essential ")
endif()


## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(include ${catkin_INCLUDE_DIRS})
include_directories(${ur_package_INCLUDE_DIRS})

## Declare a C++ library
 add_library(robot_controller_library
     src/List_Container/List_Container.cpp

     src/Piece_Description/Piece.cpp

     src/Robot_Description/Robot.cpp
     src/Robot_Description/Tool.cpp
     src/Robot_Description/Tool_IO_Config.cpp

     src/Position/Position_Interface.cpp
     src/Position/Position_Joint.cpp
     src/Position/Position_TCP.cpp

     src/Task/Task_Move.cpp
     src/Task/Task_Tool.cpp
     src/Task/Task_Wait.cpp
 )
add_dependencies(robot_controller_library ur10_gencpp)

# Declare a C++ executable
add_executable(robot_controller_node src/Node_Robot_Controller.cpp)
 #add_dependencies(robot_controller ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
 target_link_libraries(robot_controller_node  robot_controller_library ${catkin_LIBRARIES} ${VISP_LIBRARIES ...
(more)
edit retag flag offensive close merge delete

Comments

"Undefined reference" is a linker error; it means that you used a function or class from a header, but you either didn't link to the library that implements that function or class, or if it's a function from your code, you didn't implement it.

ahendrix gravatar image ahendrix  ( 2016-06-01 15:03:19 -0500 )edit

I just checked, all the functions in errors are implemented, for exemple : //header template <typename t=""> class List_Container{ .....; T * getElement(int i);.....}
//cpp template <class t=""> T *List_Container<t>::getElement(int i){ return this->list[i]; }
list is a vector of T

sumperfees gravatar image sumperfees  ( 2016-06-02 07:21:02 -0500 )edit

2 Answers

Sort by » oldest newest most voted
1

answered 2016-06-02 12:26:35 -0500

ahendrix gravatar image

You cannot implement template classes in your cpp file; they must be implemented in the header.

Have a look at http://stackoverflow.com/questions/49... for one post that explains the details, or just perform a Google search. This is a well documented limitation of C++.

edit flag offensive delete link more
0

answered 2021-12-23 12:28:44 -0500

AndyZe gravatar image

updated 2021-12-23 12:28:59 -0500

Another cause could be that you forgot the namespace in your .cpp file. For example, if you had this in the header:

bool parseTrajectory();

And the same in your .cpp file:

bool parseTrajectory(); --> Should be bool ClassName::parseTrajectory();

edit flag offensive delete link more

Question Tools

1 follower

Stats

Asked: 2016-06-01 12:45:09 -0500

Seen: 5,262 times

Last updated: Dec 23 '21