CMake 简介
CMake是什么?
- 全称 Cross Platform Make,起初为了跨平台需求,而后不断完善并广泛使用
- 一款优秀的工程构建工具
特点和优势
- 开放源代码,具有BSD许可
- 跨平台,支持Linux,Mac和Windows等不同操作系统
- 编译语言简单,易用,简化编译构建过程和编译过程
- 编程高效(比autotools快40%),可扩展(ros钟catkin,ament,colcon都是基于cmake构建)
CMake与其他编译工具的对比
-
GCC
- 由GNU开发的编译语言译器,C/C++,java等语言开发
- 当项目比较简单,可以使用gcc/g++编译目标和项目
- 比较复杂的项目,用gcc组织编译架构极其困难
-
MakeFile
- MakeFile是有条理的gcc编译命令的文件,利用make工具来执行MakeFile文件的编译指令
- 程序 简单,可以手写MakeFile
- 程序复杂,利用CMake和autotools来自动生成MakeFile。
-
Autotools
- autotools是一个工具集,具有灵活性较大,对用户角度使用较为友好(cmake生成文件权限较多)
- 开发步骤太多,配置繁琐(autoscan+autocconf+automake)
- 通常编译的config文件,大多通过autotools构建的,最终生成Makefile和config.h文件
-
CMake
- CMake类似Make工具功能,用来“读取”并执行CMakeLists.txt文件的语句,最终生成Makefile文件
- CMake语言开发简单,易于理解
CMake语句的主体框架
主体框架:
- 工程配置部分:工程名、编译调试模式、编译系统语言
- 依赖执行部分:工程包,头文件、依赖库等
- 其他辅助部分(非必需):参数打印、遍历目录等
- 判断控制部分(非必需):条件判断、函数定义、条件执行等
CMake的常用指令以及变量
基本常用指令
-
ADD_EXECUTABLE
- 为源文件的编译添加由-D引入的宏定义。
- 命令格式为 :
add_definitions(-DFOO -DBAR ...)
- 对宏定义操作:
-
OPTION
- 提供用户可以选择的选项。
- 命令格式为 :
option(<variable> "description [initial value])
-
ADD_CUSTOM_COMMAND/TARGET
- [COMMAND] : 为工程添加一条自定义的构建规则。
- [TARGET] : 用于给指定名称的目标执行指定的命令,该目标没有输出文件,并始终被构建。
-
ADD_DEPENDENCIES(没懂)
- 用于解决链接时依赖的问题。
- 当定义的target依赖的另一个target,确保在源码编译本target之前,其他的target已经被构建,使用该语句。
-
INSTALL
- 用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等。
- 用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等。
-
TARGET_INCLUDE_DIRECTORIES
- 设置include文件查找的目录,具体包含头文件应用形式,安装位置等。
- 命令格式为:
target_include_directories(<target>[SYSTEM][BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items])
-
SET_TARGET_PROPERTIES
- 设置目标的一些属性来改变它们构建的方式。
- 命令格式为:
-
ENABLE_TESTING/ADD_TEST
- [enable_testing] :用来控制Makefile是否构建test目标。
- [add_test] : 一般需要和enable_testing()配合使用
- 命令格式为:ADD_TEST(testname Exename arg1 arg2 …)
- 生成makefile后可用make test执行测试
基本常用变量
变量名 | 具体含义 |
---|---|
CMAKE_INSTALL_PREFIX | 构建install的路径 |
$ENV{HOME} | HOME环境下的目录路径 |
PROJECT_NAME | 工程名变量 |
< PKG >_INCLUDE_DIR | 导入包头文件全路径 |
< PKG >_LIBRARIES | 导入库文件的全路径 |
PROJECT_SOURCE_DIR | 构建工程的全路径 |
CMAKE_VERSION | Cmake的版本号 |
CMAKE_SOURCE_DIR | 源码树的顶层路径 |