ROS中创建软件包所依赖的文件为CMakeList.txt,catkin_make会根据你写的CMakeList.txt来配置编译软件包。
CMakeList.txt文件主要包含以下内容:
所需CMake版本 cmake_minimum_required(VERSION 2.8.3)
软件包名称 project()
查找构建此包所需的包 find_package()
消息/服务/动作生成器 add_message_files(),add_service_files(),add_action_files()
消息/服务/动作生成 generate_messages()
指定包构建的消息导出 catkin_package()
要建立的库/可执行文件 add_library()/ add_executable()/ target_link_libraries())target_link_libraryes通常情况下要有
1. 所需CMake版本
2. 软件包名称
project(package_name)
在使用catkin_create_pkg创建包时,后面跟的参数(包名)就是此处的package_name
在CMakeList.txt后面的部分可以使用 ${PROJECT_NAME} 来使用此参数
3. 查找此包创建时所需要的其它包
find_package(catkin REQUIRED)
find_package(roscpp REQUIRED)
find_package(rospy REQUIRED)
find_package(std_msgs REQUIRED)
其中catkin是创建每个包所必须的依赖项,创建包时所依赖的其它项又可以将其组成catkin的组件,所以上面可以总写为:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
如果要使用 C++ 和 Boost,则需要引用 find_package 包含 Boost,并且指明 Boost 的类型,如使用 Boost threads,则:
find_package(Boost REQUIRED COMPONENTS thread)
4. add_message_files()
像message service 和action的定义需要在catkin_package()之前
## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
比如:
add_message_files(
FILES Num1.msg Num2.msg
)
5. catkin_package()
catkin_package(
INCLUDE_DIRS include # 此项打开之后该软件包的include文件可以被其它包所引用
LIBRARIES ${PROJECT_NAME} #同理
CATKIN_DEPENDS roscpp nodelet
DEPENDS eigen opencv)
6. 包含文件目录
include_directories(include ${catkin_INCLUDE_DIRS})
其中include是指包含本软件包下的头文件, ${catkin_INCLUDE_DIRS}是指ROS下其它包的头文件,include需要写在${catkin_INCLUDE_DIRS}前面。
7. 生成可执行文件
#其中talker为将要生成的二进制文件,在ros所有的包中必须是独一无二不能重复的,src/talker.cpp为需要编译的源文件
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
生成的可执行文件会存放在./devel/lib/*pack_name*/下: