我是ROS(Indigo)的新手,我想写一个C ++程序来使用MoveIt!封装
但是,我对我在CMakeLists.txt文件中需要的内容感到困惑,因此可以找到头文件和库文件。
例如,到目前为止这是文件:
cmake_minimum_required(VERSION 2.8.1)
project(MicoMoveIt)
set(CMAKE_CXX_FLAGS "-std=c++11")
file(GLOB srcs *.cpp)
include_directories(/opt/ros/indigo/include)
link_directories(/opt/ros/indigo/lib)
add_executable(${PROJECT_NAME} ${srcs})
我的main.cpp文件是:
#include <ros/ros.h>
#include <moveit/move_group_interface/move_group.h>
int main()
{
moveit::planning_interface::MoveGroup group("right_arm");
return 0;
}
但是编译它会给我一个错误:
/opt/ros/indigo/include/moveit/robot_model/joint_model.h:47: error: Eigen/Geometry: No such file or directory
#include <Eigen/Geometry>
^
所以,我需要指定在哪里找到这些Eigen头文件。但鉴于Eigen是MoveIt!的依赖项,那么我不必手动包含所有这些头文件目录。
我应该如何编写CMakeLists.txt文件,以便包含依赖项的所有头文件和库目录?
答案 0 :(得分:1)
尝试进行此更改:
cmake_minimum_required(VERSION 2.8.3)
project(<project_name>)
set(CMAKE_CXX_FLAGS "-std=c++11")
find_package(catkin REQUIRED COMPONENTS
<other_packages_you_need>
moveit_ros_planning_interface
)
catkin_package(CATKIN_DEPENDS)
include_directories(include ${catkin_INCLUDE_DIRS})
set(BINNAME <executable_name>)
set(SOURCES <cpp_source_files>)
add_executable (${BINNAME} ${SOURCES})
target_link_libraries(${BINNAME} ${catkin_LIBRARIES})
您的问题的关键因素是在moveit_ros_planning_interface
指令中包含了包find_package()
。每次必须构建一些代码时,必须将每个包依赖项添加到项目中(在这种情况下,您需要moveit接口包)。请注意,package.xml
文件也起着至关重要的作用。
最后,您必须告诉链接器检索并链接您在项目中使用的库。为此,请使用target_link_libraries()
和有用的catkin_LIBRARIES
变量,它几乎可以达到您的预期(您可以手动添加库,但在大型项目中可能会很混乱)。
编辑:在这种情况下,您不需要link_directories()
指令,只有在链接器必须知道在何处检索外部库时才需要使用该指令。