用于构建软件包的 CMake 构建系统的输入,描述了如何构建代码以及将代码安装到哪里。
结构顺序
CMakeLists.txt 文件必须遵循格式,否则包将无法正确构建。且配置顺序也非常重要。
CMake 版本
catkin CMakeLists.txt 文件必须以所需的 CMake 版本开头,需要 2.8.3 或更高版本。
cmake_minimum_required(VERSION 2.8.3)
包名
在 CMake 中,可以后面在脚本中的任何位置引用项目名称,方法是在需要的地方使用变量 ${PROJECT_NAME}。
project(Test_ros)
查找依赖
使用 find_package 引入依赖包,先来看基础的 Module 模式
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...])
- PackageName:必填参数,需要查找的包名
- version:可选参数,指定版本,如果指定就必须检查找到的包的版本是否和version兼容
- EXACT:可选参数,如果指定EXACT则表示必须完全匹配的版本而不是兼容版本就可以
- QUIET:可选参数,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语)
- MODULE:可选字段,Module 模式下查找失败并不切换到 Config 模式继续查找
- REQUIRED:可选字段。表示一定要找到包,找不到的话就立即停掉整个CMake
- COMPONENTS:可选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败
- OPTIONAL_COMPONENTS:可选字段,不一定找到,只要满足所有必需的组件,仍然可以认为整个包都找到了
当 Cmake 通过 find_package 找到了某个包,则会创建几个 Cmake 环境变量,环境变量描述了包导出的头文件在哪里、源文件在哪里、包依赖的库以及这些库的路径。
<NAME>_FOUND
如果找到库,则设置为 true,否则设置为 false<NAME>_INCLUDE_DIRS
或<NAME>_INCLUDES
包导出的包含路径<NAME>_LIBRARIES
或<NAME>_LIBS
包导出的库<NAME>_DEFINITIONS
包中含有的预处理指令
对于 ROS 自带的依赖建议添加为 catkin 包,因为可以使用 catkin_ 前缀创建统一环境变量。
find_package(catkin REQUIRED COMPONENTS nodelet roscpp rospy sensor_msgs std_msgs std_srvs)
对于外部依赖,则直接为查找的包名。则会创建 OpenCV_INCLUDE_DIRS、OpenCV_LIBRARIES 等环境变量。
find_package(OpenCV REQUIRED QUIET COMPONENTS core calib3d imgproc photo video OPTIONAL_COMPONENTS aruco xfeatures2d nonfree)
Python支持
catkin_python_setup()
消息/服务/动作生成器
加载自定义的 msg、svr、action,该指令必须出现在 catkin_package() 之前,以便生成正常工作。
## 加载在msg文件夹中的自定义msg
add_message_files(
FILES
Info.msg
KeyPoint.msg
)
## 加载在svr文件夹中的自定义svr
add_service_files(
FILES
GetMap.srv
GetMap2.srv
)
## 加载在action文件夹中的自定义action
add_action_files()
(
FILES
Myaction.action
)
调用消息/服务/动作生成
generate_messages(
DEPENDENCIES
std_msgs
geometry_msgs
sensor_msgs
)
catkin 配置
指定包构建中的信息,用于 catkin 的构建、生成配置文件与 cmake 文件,必须在使用 add_library()
或 add_executable()
之前调用此函数。
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS roscpp nodelet
DEPENDS eigen opencv)
- INCLUDE_DIRS 包导出头文件的位置
- LIBRARIES 从项目中导出的库
- CATKIN_DEPENDS 本项目依赖的其他 catkin 项目
- DEPENDS - 此项目所依赖的非 catkin 项目
指定构建目标
构建目标可以采用多种形式,通常有以下两种可能性之一:
- 可执行目标 - 我们可以运行的程序
- 库目标 - 可执行目标在构建和/或运行时可以调用的库
头文件目录
指定在哪里可以找到正在构建的代码的头文件
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/include
${OpenCV_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
${catkin_INCLUDE_DIRS}
)
链接目录
link_directories()函数可用于添加额外的库路径,但包在 find_packaged 时都会自动添加它们的链接信息,一般用不到
link_directories(~/my_libs)
可执行目标
构建一个名为myProgram的目标可执行文件,它由 3 个源文件构建:src/main.cpp、src/some_file.cpp 和 src/another_file.cpp。
add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
库目标
用于指定要构建的库。默认情况下,catkin 构建共享库。
add_library(test_ros
test1.cpp
test2.cpp
test3.cpp
)
以上例子将输出:librtest_ros.so
链接库
指定可执行目标链接的库
add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo) -- 将 foo 链接到 libmoo.so
目标重命名
在 catkin 中构建目标的名称必须是唯一的,但是仅在** catkin 内部**。
set_target_properties(rviz_image_view
PROPERTIES OUTPUT_NAME image_view
PREFIX "")
这将在构建和安装输出中将目标 rviz_image_view 的名称重命名为 image_view 。
指定可安装目标
在构建时间之后,目标被放置到 catkin 工作空间的开发空间中。但是,通常我们希望将目标安装到系统。
install(TARGETS ${PROJECT_NAME}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
- TARGETS - 要安装的目标
- ARCHIVE DESTINATION - 静态库和 DLL (Windows) .lib 存根
- LIBRARY DESTINATION - 非 DLL 共享库和模块
- RUNTIME DESTINATION - 可执行目标和 DLL (Windows) 风格的共享库
例如:
install(TARGETS
test_ros
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
安装 Python 可执行脚本
catkin_install_python(PROGRAMS
scripts/patrol.py
scripts/objects_to_tags.py
scripts/point_to_tf.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
安装头文件
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
安装 nodelet 插件库
install(FILES
nodelet_plugins.xml
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
评论区