0
$\begingroup$

Rosanswers logo

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::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::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::getElement(int) » Node_Robot_Controller.cpp:(.text+0x977): référence indéfinie vers « List_Container::next() » Node_Robot_Controller.cpp:(.text+0xa60): référence indéfinie vers « List_Container::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::getElement(int) » Node_Robot_Controller.cpp:(.text+0xadd): référence indéfinie vers « List_Container::isEmpty() » /home/tcozic/Documents/git_ur10/catkin_ws/devel/lib/librobot_controller_library.so: référence indéfinie vers « error_norm(std::vector >, std::vector >) » /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}) </code></pre> 

All *.cpp files are classes, with theirs own headers in the include/ur10/ [Directory_name]/directories, except for the Node_controller_node.cpp

This is my first big project with ROS and I don't understand where the problem come from....

Thanks in advance for your help !

Edit : I tried to compile the library without the node:

  ## Declare a C++ library set(SOURCE_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 src/Task/Task_Interface.cpp ) add_library(Robot_controller_lib ${SOURCE_robot_controller_library}) add_dependencies(Robot_controller_lib ur10_gencpp) target_link_libraries(Robot_controller_lib ${catkin_LIBRARIES} ${VISP_LIBRARIES}) 

I don't have any errrors, but I keep getting the reference error when I try to add the compilation of the node :

 add_executable(robot_controller_node src/Node_Robot_Controller.cpp) add_dependencies(robot_controller_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(robot_controller_node Robot_controller_lib ${catkin_LIBRARIES} ${VISP_LIBRARIES}) 

PS: I can't post code here, it is for a professionnal project.

Could it be a probleme with the use of inheritance or virtual functions with catkin ? The classes List_Container and Task_Interface possess virtual functions and inherit others class. I already make sure that all functions have been implemented.


Originally posted by sumperfees on ROS Answers with karma: 77 on 2016-06-01

Post score: 0


Original comments

Comment by ahendrix on 2016-06-01:
"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.

Comment by sumperfees on 2016-06-02:
I just checked, all the functions in errors are implemented, for exemple : //header template class List_Container{ .....; T * getElement(int i);.....}
//cpp template T *List_Container::getElement(int i){ return this->list[i]; }
list is a vector of T

$\endgroup$

1 Answer 1

0
$\begingroup$

Rosanswers logo

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

Have a look at http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file for one post that explains the details, or just perform a Google search. This is a well documented limitation of C++.


Originally posted by ahendrix with karma: 47576 on 2016-06-02

This answer was ACCEPTED on the original site

Post score: 1

$\endgroup$