1.概述
CMakeLists.txt 是CMake编译系统的输入文件,用来运行CMake编译软件包。与标准CMakeLists.txt不同的是,用于catkin编译的CMakeLists.txt包含一些其他内容。
2.整体架构和顺序
Required CMake Version (cmake_minimum_required)
Package Name (project())
Find other CMake/Catkin packages needed for build (find_package())
Enable Python module support (catkin_python_setup())
Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())
Invoke message/service/action generation (generate_messages())
Specify package build info export (catkin_package())
Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
Tests to build (catkin_add_gtest())
Install rules (install())
分项解释
3.CMake Version
每个CMakeLists.txt必须以CMake Version开头,catkin最低需要2.8.3的CMake。
cmake_minimum_required(VERSION 2.8.3)
4.Package name
下一项位package name。以此格式:
project(robot_brain)
在后面的程序中,如果需要使用工程名的话,可以用 $(PROJECT_NAME)。
5.Finding Dependent CMake Packages
如果需要用到其他包来构建我们工程,需要用到:
find_package(catkin REQUIRED COMPONENTS packagename1 packagename2)
catkin REQUIRED 为必需的。
5.1find_package的具体作用
如果CMake通过find_package发现一个包,它会创建几个CMake环境变量,提供有关找到的包的信息。 这些环境变量可以稍后在CMake脚本中使用。 环境变量描述了软件包导出头文件的位置,源文件的位置,软件包所依赖的库以及这些库的路径。 名称始终遵循<PACKAGE NAME> _ <PROPERTY>的约定:
<NAME> _FOUND - 如果找到库,则设置为true,否则为false
<NAME> _INCLUDE_DIRS或<NAME> _INCLUDES - 包中导出的包含路径
<名称> _LIBRARIES或<名称> _LIBS - 由包导出的库
<NAME> _DEFINITIONS - ?
5.2Boost
如果使用c++和Boost,你需要用find_package 包含Boost并且声明你所使用的是boost的哪一部分,例如:你要用 Boost threads,你应该这样写:
find_package(Boost REQUIRED COMPONENTS thread)
6.catkin_package()
catkin_package()是catkin提供的CMake的宏。必须作用在add_library()和add_exeutable()之前,有五个可选参数
INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package
LIBRARIES - The exported libraries from the project
CATKIN_DEPENDS - Other catkin projects that this project depends on
DEPENDS - Non-catkin CMake projects that this project depends on. For a better understanding, see this explanation.
CFG_EXTRAS - Additional configuration options
例如:
catkin_package( INCLUDE_DIRS include LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS roscpp nodelet DEPENDS eigen opencv)
7.构建指定目标
构建目标有多种形式,但通常可以有两个代表:
Exectable Target :可执行文件
Library Target :在构建或运行时由可执行目标运行的库
7.1目标命名
catkin要求命名唯一。但实际上是CMake内部的目标名称需要唯一,可用set_target_properties()来替换目标名称。例如:
set_target_properties(rviz_image_view PROPERTIES OUTPUT_NAME image_view PREFIX "")
8.Messages,Services,and Action Targets
add_message_files
add_service_files
add_action_files
之后必须加 generate_messages()
若有消息文件,则catkin_package()中需要加上
catkin_package(
CATKIN_DEPENDS message_runtime
)