1.CMake概述

​ CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多数IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。

​ 而CMake恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,在根据编译平台,自动生成本地化的Makefile和工程文件,最后用户只需make编译即可,所以可以把CMake看成一款自动生成 Makefile的工具,其编译流程如下图:

  • 蓝色虚线表示使用makefile构建项目的过程
  • 红色实线表示使用cmake构建项目的过程

优点:

  • 跨平台
  • 能够管理大型项目
  • 简化编译构建过程和编译过程
  • 可扩展:可以为cmake编写特定功能的模块,扩充cmake功能
  • 支持生成几乎所有主流IDE的项目

缺点:

  • cmake新版本与老版本变化有点大,API不稳定(cmake还在成长)

CMake没有阻碍C++的发展,相反CMake拯救了C++

  • 相比其它语言的构建工具,CMake自然要复杂很多,但这不是CMake的问题。相比其它的编程语言,C/C++更关注底层和构建其它的编程语言,即往往用于原始创新的项目,因此C/C++面临的问题(环境)与其它编程语言不是很一样,也就导致CMake比较困难
  • 正因为CMake的出现,C++才终于完成了项目跨平台(以前很难跨平台)

CMake与Makefile、Make的关系

  • Makefile并不跨平台,Cmake会根据编译器的类型来决定是否生成Makefile,大多数情况下CMake会生产Makefile

  • 大型项目不推荐手动编写Makefile

  • Make工具(类似批处理工具)是通过调用makefile文件中的命令实现编译和链接的,最好不要在cmake中使用make命令

  • make是一个自动化构建工具,用于根据规则生成目标文件(如可执行文件、库文件等)。它通过读取一个名为Makefile或makefile的配置文件来确定如何构建项目

  • makefile是make工具的配置文件,它定义了如何构建项目

CMake命令行执行流程:

1.编写CMakeLists.txt文件,下面是最基本的配置

  • cmake_minimum_required(VERSION 3.20) #指定最小版本3.20
  • project(Hello) #指定项目名称
  • add_executable(Hello hello.cpp) #由源文件(.cpp)生成一个可执行的程序(二进制文件)

2.cmake -B build

  • 创建一个build(名字任取),并在此目录下生成makefile或其它文件

3.cmake –build build(步骤2生成的文件夹名)

  • 生成项目

2.Windows下用CMake构建项目

安装CMake

官网下载:(https://cmake.org/download/)

Windows下的build system generator

  • cmake默认的编译器是MSVC (vs2022与vs2019)
  • 可用安装MinGW (gcc与clang)
  • cmake参数:cmake -G <generator-name> -T <toolset-spec> -A <platform-name> <path-to-source>
  • 通过指定-G “MinGW Makefile” 来指定cmake使用gcc

补充:

  • MSVC:是微软为 Windows 平台提供的 C++ 编译器及工具链,深度集成在 Visual Studio 开发环境中。它专注于 Windows 开发,提供了丰富的调试工具和性能优化
  • MinGW:是基于 GNU 工具链(GCC)的 Windows 实现,旨在为 Windows 提供一个轻量级的开发环境

MSVC 和 MinGW 都是 Windows 系统上用于编译 C++ 代码的编译器工具链,开发者可以根据自己的需求选择其中一种来编译项目

cmake下通过MSVC构建项目

1.创建一个文件夹CMake_study,在该文件夹下:

  • 编写源文件hello.cpp

    1
    2
    3
    4
    5
    6
    #include <iostream>

    int main(int argc, char const *argv[]){
    std::cout<<"hello"<<std::endl;
    return 0;
    }
  • 创建CMakeLists.txt配置文件,进行编写

    1
    2
    3
    cmake_minimum_required(VERSION 3.20)
    project(Hello)
    add_executable(Hello hello.cpp)

2.vscode中将终端切换为git bash,执行cmake -B build_MSVC,创建一个build_MSVC文件夹,并在此文件夹下生成makefile或其它文件(关于cmake的项目)

3.执行cmake --build build_MSVC,在build_MSVC\Debug下生成可执行文件

cmake下通过MinGW构建项目

1.与上面第一个步骤一样,在CMake_study下编写hello.cpp源文件和CMakeLists.txt配置文件

2.git bash终端执行cmake -B build_MinWG -G "MinGW Makefiles",创建一个build_MinWG文件夹,里面的文件通过gcc

来编译生成的(通过指定了编译器名称MinGW Makefiles)

3.执行cmake --build build_MinGw,在build_MSVC下生成可执行文件

CMake语法

下面主要通过在.cmake文件里面编写语法来执行,创建一个first.cmake文件进行编写内容

运行.cmake文件:

  • cmake -P .cmake文件名

1.输入输出message()

1
2
3
4
5
6
7
8
9
10
cmake_minimum_required(VERSION 3.20)
message("hello")
message(hello)
message("abc
def")
message([[xyz
aaa]])

#获取CMAKE中的信息,通过${}
message(${CMAKE_VERSION})

结果:

2.变量操作set、list

  • CMake中的变量分为两种,即CMake提供和自定义的
  • CMake变量的命名区分大小写
  • CMake中的变量在存储时都是字符串
  • CMake获取变量方式:${变量名}
  • 变量的基础操作是set()与unset(),但也可以用list或是string操作变量