🌈个人主页:Zfox_
🔥系列专栏:CMake
目录
- 一:🔥 前言背景
- 1. 为什么要有 CMake?
- 2. CMake 的发展历史
- 3. CMake 的背景与设计哲学
- 二:🔥 安装
- 三:🔥 快速熟悉 -- Hello World 工程
- 🦋 思考
- 四:🔥 共勉
一:🔥 前言背景
Make 就是“跨平台构建的万能遥控器”——你写一份简单的说明书(CMakeLists.txt),它就能给 Windows 生成.vcxproj,给 Linux 生成 Makefile,给 macOS 生成 Xcode 工程,再也不用为每个平台手写不同的编译脚本。
1. 为什么要有 CMake?
CMake 把 “平台、编译器、依赖”全部抽象掉,一次编写,“Write once, build everywhere”。
最核心的功能:自动生成各个构建系统对应的配置文件
1. 跨平台构建需求日益增长:在 20 世纪末到 21 世纪初,软件项目越来越需要在多个操作系统(Windows、Linux、macOS)和多个编译器(GCC、Clang、MSVC)上构建。
Windows 用 Visual Studio,Linux 用 Makefile,macOS 用 Xcode——格式全不一样,如下:
- Makefile:Unix/Linux 上常用,但在 Windows 上支持差,而且 几十万源文件,手写 Makefile 等于自杀
- Visual Studio 项目文件(.vcxproj):仅限 Windows。
- Autotools(autoconf/automake):主要用于 Unix-like 系统,配置复杂,Windows 支持差。
这些工具无法统一管理跨平台构建,导致开发者需要为每个平台维护一套构建脚本,成本高、易出错。
2. 构建逻辑与平台细节分离
CMake 的核心思想是:用平台无关的 CMakeLists.txt 描述构建逻辑,然后由 CMake 为不同平台生成对应的本地构建系统文件(如 Makefile、Visual Studio 项目、Xcode 项目等)
这样,开发者只需写一份构建描述,CMake 自动适配目标平台,极大简化了多平台开发。
3. 管理复杂依赖和项目结构
大型项目(如 KDE、VTK、ITK、LLVM、OpenCV)包含多个子模块、库、可执行文件、测试等,手动维护 Makefile 或项目文件非常困难。而 CMake 提供:
- 模块化构建(add_subdirectory)
- 依赖自动管理(target_link_libraries)
- 编译选项与路径配置(include_directories, target_compile_definitions)
- 测试集成(CTest)
- 安装与打包(CPack)
4. 与 IDE 和工具链集成:CMake 可以生成主流 IDE 的项目文件(如 VS、Xcode、CLion、Qt Creator),方便开发者在熟悉的环境中开发,同时保持构建描述的一致性。
2. CMake 的发展历史
起源(2000 年):CMake 最初由Kitware 公司为支持其医学影像处理项目Insight Segmentation and Registration Toolkit (ITK)而开发。ITK 需要在多个平台(包括 Windows)上构建,而当时 Autotools 在 Windows 上表现不佳,Visual Studio 项目又无法跨平台,于是 Kitware 决定开发一个新工具 —— CMake。
“CMake” 名称含义:Cross-platform Make(跨平台 Make),但实际它不是 Make,而是 Makefile 生成器。
重要版本里程碑
- 2000 年:CMake 1.0 发布,最初支持 Unix 和 Windows。
- 2003 年:CMake 1.4 支持生成 Visual Studio 项目文件,极大推动 Windows 开发者采用。
- 2006 年:CMake 2.4 发布,功能趋于稳定,被 KDE、VTK 等大型开源项目采用。
- 2010 年代:CMake 2.8 成为长期稳定版本,广泛用于工业界和学术界。
- 2015 年:CMake 3.0 发布,引入“现代 CMake”概念,强调基于目标(target-based)的构建方式,取代旧式全局变量方式。
- 2017 年:CMake 3.8 支持 C++17,3.11 支持 FetchContent(替代 ExternalProject 简化依赖管理)。
- 2020 年:CMake 3.17+ 支持 C++20,集成 CUDA、Swift 等语言,支持更复杂的构建场景。
- 2023 年至今:CMake 持续迭代,支持嵌入式、交叉编译、包管理(CPM、vcpkg 集成)、IDE 更好集成等。
社区与生态发展
- 被几乎所有主流 C/C++ 项目采用:LLVM、OpenCV、Qt、Boost(部分)、ROS、TensorFlow C++ 接口等。
- 成为 C++ 构建的事实标准。
- 与包管理器(vcpkg、Conan、Hunter)深度集成。
- IDE 原生支持:CLion、VS Code + CMake Tools、Qt Creator、Visual Studio(2017+ 原生支持 CMake 项目)。
没有 CMake,跨平台 C++ 开发就像徒手拧螺丝;有了 CMake,等于电动批头——一套动作,全平台秒装。
3. CMake 的背景与设计哲学
1. 设计目标
- 跨平台:一份配置,多平台生成。
- 可扩展:支持自定义命令、模块、函数。
- 可读性:CMakeLists.txt 比原始 Makefile 更结构化、语义化。
- 与编译器/工具链解耦:不绑定特定编译器,支持 GCC、Clang、MSVC、Intel、NVIDIA CUDA 等。
2. 与传统工具对比
| 工具 | 优点 | 缺点 |
|---|---|---|
| Make | 简单、通用 | 手动编写复杂、跨平台差 |
| Autotools | Unix 标准、功能强大 | 配置复杂、Windows 支持差 |
| Visual Studio | IDE 集成好、调试方便 | 仅限 Windows、无法跨平台 |
| CMake | 跨平台、现代、生态强大 | 学习曲线陡峭、语法有时冗长 |
3. “现代 CMake” 理念(CMake 3.0+)
- 使用
target_*命令(如target_include_directories,target_link_libraries)替代全局命令(如include_directories)。 - 强调封装性和可重用性:每个 target 自带属性,避免全局污染。
- 支持导入目标(imported targets),便于第三方库集成。
- 推荐使用
FetchContent、find_package管理依赖。
小结
CMake 的存在,是为了让开发者专注于代码,而不是构建脚本;让项目一次编写,随处构建。
二:🔥 安装
- CMake官方源代码下载地址:https://cmake.org/download/
- CMake官方英文档地址:https://cmake.org/cmake/help/latest/index.html
直接输入下面指令安装即可:
sudoaptinstallcmake# 验证安装$ cmake --version cmake version3.22.1 CMake suite maintained and supported by Kitware(kitware.com/cmake).VScode 上 CMake 插件安装
VS Code CMake 插件有以下2点好处:
- 语法高亮和代码补全:对 CMakeLists.txt 文件提供语法高亮显示,使代码结构更加清晰易读。同时,支持代码补全功能,当你输入 CMake 命令或变量时,插件会自动提示可能的选项,减少手动输入的错误和时间。
- 智能分析和错误检查:能够对 CMakeLists.txt 文件进行智能分析,检查其中的语法错误和在问题,并在编辑器中实时显示错误提示和警告信息,帮助你及时发现和解决问题。
搜索 CMake, 安装下面四个插件即可:
三:🔥 快速熟悉 – Hello World 工程
学习任何一门技术,最开始的时候都是从编写输出 Hello World 开始 😏
一般步骤如下
- 编写 CMake 配置文件(定义要生成的目标以及源代码列表)
- 使用 CMake 生成 Makeflie
- 使用
make编译工程
下图展示使用 CMake 来管理 Hello World 程序生成的过程
在当前目录创建如下两个文件:
hello.cpp
#include<iostream>intmain(){std::cout<<"Hello World!"<<std::endl;return0;}CMakeLists.txt(注意CMakeLists大小写 还有末尾不要多空格,不要写错了)
# 1. 设置能运行 CMake 项目的最低CMake 版本 cmake_minimum_required(VERSION 3.18) # 2. 设置项目名称 project(helloWorld) # 3. 添加构建目标 add_executable(hello hello.cpp)- 第一行意思是 cmake 最低版本要求 3.18
- 第二行是本项目的工程名
- 第三行:第一个变量:要生成的可执行文件名为 hello,后面的参数是需要的依赖。
接着在当前目录下执行cmake .
# 生成 Makefile 文件$ cmake.-- The C compiler identification is GNU11.4.0 -- The CXX compiler identification is GNU11.4.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info -done-- Checkforworking C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features -done-- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info -done-- Checkforworking CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features -done-- Configuringdone-- Generatingdone-- Build files have been written to: /home/lighthouse/code/cmake/learn1此时就可以发现当前文件夹下多了许多文件,如下:
$lsCMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt hello hello.cpp Makefile然后看到了 Makefile,相信大家后面都会用了吧,如下:
# 生成可执行文件$make[50%]Building CXX object CMakeFiles/hello.dir/hello.cpp.o[100%]Linking CXX executable hello[100%]Built target hello# 运行可执行文件$ ./hello Hello World!🦋 思考
问题一:为什么需要设置最低的cmake版本?
CMake 是一个不断迭代的工具(目前最新4.x,历史有3.x),不同版本可能会引入新的语法、命令、模块或行为变更。如果项目中使用了高版本 CMake 才支持的特性(例如特定的函数、生成器表达式、目标属性等),而用户本地安装的cmake版本低于项目要求的版本,就会出现无法解释或者产生不可预知的行为。
为了防止以上情况出现:CMake 给我们提供了cmake_minimum_required,这个命令会在配置阶段(cmake 命令执行时)检查当前 CMake 版本:
- 若当前版本低于最低要求,CMake 会直接终止并报错,明确提示“需要至少 X.X版本”,避免后续因版本不兼容导致的模糊错误。
- 若当前安装的版本满足要求,则继续执行后续配置流程。
问题二:CMake 里的"目标"是什么?
在 CMake 中,“目标 (Target) 代表了一个需要被生成的实体,如可执行文件、静态库/动态库等,和 Makefile 里的目标是一个意思,他是现在 CMake 里最核心的3个概念之一(后面会介绍的)
四:🔥 共勉
😋 以上就是我对【CMake#1】:CMake 安装与快速上手的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉