我正在尝试使用ROS构建一个项目,但我不断得到“对<>”的未定义引用错误,例如:
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
这是我的CmakeLists.txt,用于编译此软件包:
<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>
所有* .cpp文件都是类,在include / ur10 / [Directory_name] /目录中有自己的头文件,但Node_controller_node.cpp除外
这是我第一个使用ROS的大项目,我不明白问题的来源......
提前感谢您的帮助!
编辑:我试图在没有节点的情况下编译库:
## 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})
我没有任何错误,但是当我尝试添加节点的编译时,我一直收到引用错误:
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:我不能在这里发布代码,这是专业项目。
使用catkin继承或虚函数会不会成为一个问题? List_Container和Task_Interface类拥有虚函数并继承其他类。我已经确保所有功能都已实现。