CMake基础
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
int main(int argc, char const *argv[]){
std::cout<<"hello"<<std::endl;
return 0;
}创建CMakeLists.txt配置文件,进行编写
1
2
3cmake_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 | cmake_minimum_required(VERSION 3.20) |
结果:
2.变量操作set、list
- CMake中的变量分为两种,即CMake提供和自定义的
- CMake变量的命名区分大小写
- CMake中的变量在存储时都是字符串
- CMake获取变量方式:${变量名}
- 变量的基础操作是set()与unset(),但也可以用list或是string操作变量