news 2026/2/20 0:41:14

【CMake#1】:CMake 安装快速上手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【CMake#1】:CMake 安装快速上手

🌈个人主页: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简单、通用手动编写复杂、跨平台差
AutotoolsUnix 标准、功能强大配置复杂、Windows 支持差
Visual StudioIDE 集成好、调试方便仅限 Windows、无法跨平台
CMake跨平台、现代、生态强大学习曲线陡峭、语法有时冗长

3. “现代 CMake” 理念(CMake 3.0+)

  • 使用target_*命令(如target_include_directories,target_link_libraries)替代全局命令(如include_directories)。
  • 强调封装性和可重用性:每个 target 自带属性,避免全局污染。
  • 支持导入目标(imported targets),便于第三方库集成。
  • 推荐使用FetchContentfind_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 开始 😏

一般步骤如下

  1. 编写 CMake 配置文件(定义要生成的目标以及源代码列表)
  2. 使用 CMake 生成 Makeflie
  3. 使用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 安装与快速上手的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/18 10:37:01

中望CAD2026:消除图纸中的重线

在处理图形时&#xff0c;消除重合或部分重合的线条是一个常见的优化需求&#xff0c;它可以减少文件大小、提升编辑效率并避免显示错误。1.点击菜单【常用-修改-消除重线】&#xff08;【OVERKILL】命令&#xff09;&#xff1b;2.选择想要删除的重线范围&#xff0c;选择后会…

作者头像 李华
网站建设 2026/2/18 3:49:35

Docker实战:创建和使用Docker私有仓库

文章目录1. 实战概述2. 实战步骤2.1 创建Docker私有仓库2.1.1 获取并查看registry镜像2.1.2 启动并查看registry容器2.1.3 查看仓库的镜像目录2.1.4 获取busybox镜像并修改标签2.1.5 修改Docker服务文件2.1.6 上传busybox镜像到本地仓库2.2 获取私有仓库的镜像2.2.1 在Euler02上…

作者头像 李华
网站建设 2026/2/18 14:03:51

K8S-EFK日志收集实战指南

K8S-EFK日志收部署EFK1、创建nfs存储访问启动master节点的nfs服务创建/data/v1kubectl create -f serviceaccount.yaml ​ kubectl create -f rbac.yaml修改deployment.yaml文件NFS SERVER #存储地址 ​ kubectl create -f deployment.yaml ​ kubectl create -f class.yaml2、…

作者头像 李华
网站建设 2026/2/19 18:00:43

外贸流程管理系统

import datetime# 全局数据customer_list []order_list []def main_menu():while True:print("\n 外贸流程管理系统 ")print("1. 客户管理 | 2. 订单管理 | 3. 数据统计 | 4. 退出")choice input("选择功能(1-4): ")if choice 1: customer_m…

作者头像 李华
网站建设 2026/2/19 4:18:18

200万token上下文能力,并且越用越聪明!Google Research重构AI长期记忆

Google Research发布的Titans架构通过在推理阶段实时训练深层神经网络模块&#xff0c;让AI拥有了处理超过200万token上下文的能力&#xff0c;并在MIRAS框架下统一了序列建模的数学理论。Transformer架构提出者&#xff0c;为谷歌提供基础研究、算法与生态底座的Google Resear…

作者头像 李华