4.修改构建配置文件(CMakeLists.txt)

ROS的构建系统catkin基本上使用CMake,并在功能包目录中的CMakeLists.txt文件中描述构建环境。在这个文件中设置可执行文件的创建、依赖包优先构建、连接器(linker)的创建等等,以构建的功能包my_first_ros_pkg为例说明。

构建配置文件(CMakeLists.txt)中的每一项如下所示。

1.操作系统中安装的cmake的最低版本。由于它目前被指定为版本2.8.3,所以如果使用低于此版本的cmake,则必须更新版本。
cmake_minimum_required(VERSION 2.8.3) 

2.project项是功能包的名称。只需使用用户在package.xml中输入的功能包名即可。请注意,如果功能包名称与package.xml中的<name>标记中描述的功能包名称不同,则在构建时会发生错误,因此需要注意。
project(my_first_ros_pkg) 

3.find_package项是进行构建所需的组件包。目前,roscpp和std_msgs被添加为依赖包。如果此处没有输入功能包名称,则在构建时会向用户报错。换句话说,这是让用户先创建依赖包的选项。
find_package(catkin REQUIRED COMPONENTS
 roscpp
 std_msgs)

注意::以下是使用ROS以外的功能包时使用的方法。例如,使用Boost时,必须安装system功能包。功能如前面的说明,是让用户先创建依赖功能包的选项。find_package(Boost REQUIRED COMPONENTS system) 

4.catkin_python_setup( )选项是在使用Python,也就是使用rospy时的配置选项。其功能是调用Python安装过程setup.py。

catkin_python_setup() 

5.add_message_files是添加消息文件的选项。FILES将引用当前功能包目录的msg目录中的*.msg文件,自动生成一个头文件(*.h)。在下面示例中,我们将使用消息文件Message1.msg和Message2.msg。

add_message_files(
FILES
Message1.msg
Message2.msg

6.add_service_files是添加要使用的服务文件的选项。使用FILES会引用功能包目录中的srv目录中的*.srv文件。在下面示例中,用户可以选择使用服务文件Service1.srv和Service2.srv。

add_service_files(
FILES
Service1.srv
Service2.srv
)

7.generate_messages是设置依赖的消息的选项。此示例是将DEPENDENCIES选项设置为使用std_msgs消息包。

generate_messages(
 DEPENDENCIES
 std_msgs
)

8.generate_dynamic_reconfigure_options是使用dynamic_reconfigure时加载要引用的配置文件的设置。

generate_dynamic_reconfigure_options(
 cfg/DynReconf1.cfg
 cfg/DynReconf2.cfg
)

9.下面是catkin 构建选项。INCLUDE_DIRS表示将使用INCLUDE_DIRS后面的内部目录include的头文件。LIBRARIES表示将使用随后而来的功能包的库。

(1)CATKIN_DEPENDS后面指定如roscpp或std_msgs等依赖包。目前的设置是表示依赖于roscpp和std_msgs。DEPENDS是一个描述系统依赖包的设置。

catkin_package(
INCLUDE_DIRS include
LIBRARIES my_first_ros_pkg
CATKIN_DEPENDS roscpp std_msgs
DEPENDS system_lib
)

(2)include_directories是可以指定包含目录的选项。目前设定为${catkin_INCLUDE_DIRS},这意味着将引用每个功能包中的include目录中的头文件。当用户想指定一个额外的include目录时,写在${catkin_INCLUDE_DIRS}的下一行即可。

include_directories(
 ${catkin_INCLUDE_DIRS}
)

(3)add_library声明构建之后需要创建的库。以下是引用位于my_first_ros_pkg功能包的src目录中的my_first_ros_pkg.cpp文件来创建my_first_ros_pkg库的命令。

add_library(my_first_ros_pkg
 src/${PROJECT_NAME}/my_first_ros_pkg.cpp
)

(4)add_dependencies是在构建该库和可执行文件之前,如果有需要预先生成的有依赖性的消息或dynamic_reconfigure,则要先执行。以下内容是优先生成my_first_ros_pkg(我们创建的功能包名称)库依赖的消息及dynamic reconfigure的设置。add_dependencies(my_first_ros_pkg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

(5)add_executable是对于构建之后要创建的可执行文件的选项。以下内容是引用src/my_first_ros_pkg_node.cpp文件生成my_first_ros_pkg_node可执行文件。如果有多个要引用的*.cpp文件,将其写入my_first_ros_pkg_node.cpp之后。如果要创建两个以上的可执行文件,需追加add_executable项目。

add_executable(my_first_ros_pkg_node src/my_first_ros_pkg_node.cpp)

(6)如前面描述的add_dependencies一样,add_dependencies是一个首选项,是在构建库和可执行文件之前创建依赖消息和dynamic reconfigure的设置。下面介绍名为my_first_ros_pkg_node的可执行文件的依赖关系,而不是上面提到的库。在建立可执行文件之前,先创建消息文件的情况下会经常用到。

add_dependencies(my_first_ros_pkg_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

(7)target_link_libraries是在创建特定的可执行文件之前将库和可执行文件进行链接的选项。

target_link_libraries(my_first_ros_pkg_node
 ${catkin_LIBRARIES}

ps::抄记自《ROS机器人编程 》,编译的很多错误都来自cmakelist,对这一部分的理解需要不断学习,理解。里面坑很多。。。未完待续。。。

猜你喜欢

转载自blog.csdn.net/wccsu1994/article/details/84530228
今日推荐