为ROS编写CMakeLists.txt

时间:2015-05-25 13:36:42

标签: cmake ros

我是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文件,以便包含依赖项的所有头文件和库目录?

1 个答案:

答案 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变量,它几乎可以达到您的预期(您可以手动添加库,但在大型项目中可能会很混乱)。

有关详细信息,请查看herehere

编辑:在这种情况下,您不需要link_directories()指令,只有在链接器必须知道在何处检索外部库时才需要使用该指令。