CMakeLists常用语法详解
为什么要有Cmake
上面我们提到,一套C++程序从源代码到最终可执行程序是要经历过预处理、编译、汇编、链接等多个过程,因此我们需要一套配置工具,在一个大项目运行的时候来代替上面的复杂过程,因此我们就有了Makefile,但是Makefile在大型项目、跨平台等多样化需求下显得力不从心了,因此就有了Cmake。定义如下:
CMake 是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个函数库。
CMake 通过使用简单的配置文件 CMakeLists.txt,自动生成不同平台的构建文件(如 Makefile、Ninja 构建文件、Visual Studio 工程文件等),简化了项目的编译和构建过程。
CMake 本身不是构建工具,而是生成构建系统的工具,它生成的构建系统可以使用不同的编译器和工具链。
他有如下优势:
- 跨平台支持:CMake支持多种操作系统和编译器,使得同一份构建配置可以在不同的环境中使用。
- 简化配置: 通过 CMakeLists.txt 文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本。
- 自动化构建: CMake 能够自动检测系统上的库和工具,减少手动配置的工作量。
- 灵活性: 支持多种构建类型和配置(如 Debug、Release),并允许用户自定义构建选项和模块。
基本工作流程
- 编写 CMakeLists.txt 文件: 定义项目的构建规则和依赖关系。
- 生成构建文件: 使用 CMake 生成适合当前平台的构建系统文件(例如 Makefile、Visual Studio 工程文件)。
- 执行构建: 使用生成的构建系统文件(如 make、ninja、msbuild)来编译项目。
其中,CmakeLists.txt就是CMake 的配置文件,用于定义项目的构建规则、依赖关系、编译选项等。每个 CMake 项目通常包含一个或多个 CMakeLists.txt 文件。
CmakeLists.txt语法
我们从一个项目的CMakeLists开始介绍,结合具体的项目可能会更好的理解。这里选择的项目是kf_gins_ros,这个项目是基于武汉大学开源代码KF-GINS进行修改的ROS版本,KF-GINS是一种利用卡尔曼滤波进行的GPS导航数据和IMU数据进行融合导航,获得载体更高频率的位姿信息。但是KF-GINS的数据源是txt数据,不适合仿真模拟,所以就有大佬将其修改成ROS版本,链接如下:链接: