ROS下的CMakeList.txt编写
一、 概述
CMake构建系统通过ROS包中的CMakeList.txt来构建软件包。互相依赖的包都包含一个或者多个CMakeList.txt来描述如何编译代码和如何安装。在catkin 项目中,CMakeList.txt 符合标准的vanilla CMakeList.txt 格式,但稍微有点不同。
二、 整体结构和命令一览
在编写CMakeLists.txt时必须遵循特定的格式,否则软件包将无法正确构建和编译。一个完整的ROS下CMakeList.txt由下面内容组成
- 所需CMake版本(cmake_minimum_required)
- 软件包名称(project())
- 查找构建所需的其他CMake / Catkin软件包(find_package())
- 启用Python模块支持(catkin_python_setup())
- 消息/服务/动作生成器(add_message_files(),add_service_files(),add_action_files())
- 生成消息/服务/动作等自定义消息(generate_messages())
- 指定包的构建信息输出(catkin_package())
- 要建立的库/可执行文件(add_library()/ add_executable()/ target_link_libraries())
- 测试(catkin_add_gtest())
- 安装规则(install())
三、 CMake版本
CMakeLists.txt文件必须以CMake的版本开头。下面表示的是Catkin需要2.8.3或更高的版本。
cmake_minimum_required(VERSION 2.8.3)
四、 软件包名称
继而需要指定CMake工程名,一般取作包名。例如我们的项目名叫做robot_brain
project(robot_brain)
而在CMake中,可以在CMake文本中使用变量${PROJECT_NAME}来引用项目名称。
五、 查找相关的CMake包
接下来我们要用find_package指令来指定在构建项目过程中依赖了哪些其他的包,在ROS中,catkin必备依赖,所以雷打不打地我们写上catkin REQUIRED:
find_package(catkin REQUIRED)
在此基础上,如果我们还需要依赖其他包(或者组件),我们就在 上述的包后面继续添加包(组件)名即可:
find_package(catkin REQUIRED COMPONENTS nodelet)
或者可以写成
find_package(catkin REQUIRED)
find_package(nodelet REQUIRED)
值得注意一点的是:这里添加的包用于构建包使用,而不是添加运行时依赖项。
你也可以做:
find_package(catkin REQUIRED)
find_package(nodelet REQUIRED)
如何写,看个人习惯吧,如果不考虑篇幅,其实我更喜欢把所有包(组件)列成一列,直观。在普通的CMakeLists.txt中是没有find_package()的,那么,catkin中的这个语句有啥作用呢?
5.1 那find_package()作何用?
如果CMake通过find_package找到一个包,则会自动生成有关包所在路径的CMake环境变量,环境变量描述了包中头文件的位置,源文件的位置,包所依赖的库以及这些库的路径。
这些变量名称以< PACKAGE NAME >_< PROPERTY >的形式出现:
- < NAME >_FOUND - 如果找到库,则设置为true,否则为false
- < NAME > _INCLUDE_DIRS或<NAME> _INCLUDES - 包导出的包含路径