ubuntu20.4 noetic moveit测试程序编译时报undefined reference to 错误
-
报错内容
我复制了move_group_interface_tutorial.cpp,编辑时没有报错,编译时报错:
[ 50%] Linking CXX executable /home/yaodong/cr20_ws/devel/lib/my_moveit_tutorial/my_move_group_interface_tutorial /usr/bin/ld: CMakeFiles/my_move_group_interface_tutorial.dir/src/my_move_group_interface_tutorial.cpp.o: in function `main': my_move_group_interface_tutorial.cpp:(.text+0x257): undefined reference to `moveit::planning_interface::MoveGroupInterface::MoveGroupInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<tf2_ros::Buffer> const&, ros::WallDuration const&)' /usr/bin/ld: my_move_group_interface_tutorial.cpp:(.text+0x2b2): undefined reference to `moveit::planning_interface::PlanningSceneInterface::PlanningSceneInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, bool)' /usr/bin/ld: my_move_group_interface_tutorial.cpp:(.text+0x2f5): undefined reference to `moveit::planning_interface::MoveGroupInterface::getCurrentState(double) const' /usr/bin/ld: my_move_group_interface_tutorial.cpp:(.text+0x5e9): undefined reference to `moveit::planning_interface::MoveGroupInterface::getPlanningFrame[abi:cxx11]() const' 。。。。。。。
headingCMakeLiists.txt内容如下:
cmake_minimum_required(VERSION 3.0.2) project(my_moveit_tutorial) find_package(catkin REQUIRED COMPONENTS moveit_core moveit_msgs moveit_visual_tools roscpp ) include_directories( # include ${catkin_INCLUDE_DIRS} ) add_executable(my_move_group_interface_tutorial src/my_move_group_interface_tutorial.cpp) target_link_libraries(my_move_group_interface_tutorial ${catkin_LIBRARIES} )
-
错误提示中的
undefined reference to
表示链接器在尝试构建可执行文件时找不到相关的函数定义。这通常是因为在链接阶段没有正确地链接到所需的库。在你的情况中,MoveGroupInterface
和PlanningSceneInterface
等类的函数定义在 MoveIt 的库中,但看起来这些库没有被正确链接到你的可执行文件中。你的
CMakeLists.txt
文件中有几个问题需要解决:-
包含目录:你需要确保包含了 MoveIt 和相关依赖的头文件目录。虽然
find_package(catkin REQUIRED COMPONENTS ...)
会设置一些标准的包含目录,但有时候对于特定的库(尤其是非标准库路径安装的库),你可能需要手动添加包含目录。不过,对于标准的 ROS 和 MoveIt 安装,这通常不是必需的。 -
链接库:你的
target_link_libraries
调用使用了${catkin_LIBRARIES}
,这通常包含了所有通过find_package
找到的 catkin 组件的库。然而,对于 ROS 和 MoveIt,通常更好的做法是显式地使用catkin_package()
和add_dependencies()
来确保依赖关系正确设置。同时,确保你的组件列表完整。 -
组件列表:
moveit_core
并不直接包含MoveGroupInterface
和PlanningSceneInterface
的实现。这些接口通常在moveit_ros_planning_interface
和moveit_ros_planning
等包中定义和实现。你需要确保这些包也被找到并链接。
下面是一个修改后的
CMakeLists.txt
示例,这可能帮助你解决问题:cmake_minimum_required(VERSION 3.0.2) project(my_moveit_tutorial) find_package(catkin REQUIRED COMPONENTS roscpp moveit_ros_planning_interface # 添加了此组件 moveit_msgs moveit_visual_tools ) # 通常不需要手动设置 include_directories,因为 find_package 会处理 # include_directories(${catkin_INCLUDE_DIRS}) add_executable(my_move_group_interface_tutorial src/my_move_group_interface_tutorial.cpp) # 使用 catkin_LIBRARIES 通常是可以的,但最好明确链接需要的库 # 由于 moveit_ros_planning_interface 可能依赖于其他 moveit 组件, # 使用 ${catkin_LIBRARIES} 通常也能工作,但明确依赖更好 target_link_libraries(my_move_group_interface_tutorial ${catkin_LIBRARIES} ) # 确保你的包依赖关系正确设置 catkin_package()
注意:
- 确保你的工作空间中已经安装了所有必要的 MoveIt 组件。
- 清理并重新构建你的工作空间,以确保所有更改都已生效:
cd ~/cr20_ws catkin_make clean catkin_make
- 如果你使用的是
ament_cmake
而不是catkin
(ROS 2),那么构建系统会有所不同,但原理相似。
如果问题仍然存在,检查你的 ROS 和 MoveIt 安装是否完整,或者尝试在不同的机器或环境中重现问题以排除特定环境配置的问题。
以上为生成回答,仅供参考~
-