news 2026/3/23 17:53:11

【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/3/23 23:00:49

33、虚拟化技术:VMware Server 与 Ubuntu Enterprise Cloud 全解析

虚拟化技术:VMware Server 与 Ubuntu Enterprise Cloud 全解析 1. VMware Server 基础操作与功能 在使用 VMware Server 时,右侧主面板有“Commands”部分,这里有执行一系列操作的链接,还包含快照选项、添加硬件和配置虚拟机(VM)的选项。 1.1 VM 控制台访问 当开启一…

作者头像 李华
网站建设 2026/3/21 19:52:36

突破43%成功率!WebRL-GLM-4-9B开源模型颠覆网页自动化行业格局

突破43%成功率&#xff01;WebRL-GLM-4-9B开源模型颠覆网页自动化行业格局 【免费下载链接】webrl-glm-4-9b 项目地址: https://ai.gitcode.com/zai-org/webrl-glm-4-9b 导语 你还在为网页代理任务成功率不足10%而烦恼吗&#xff1f;智谱AI最新发布的WebRL-GLM-4-9B模…

作者头像 李华
网站建设 2026/3/24 8:17:50

AI_用户增长引擎升级的前端落地全指南

AI当“增长军师”&#xff1a;用户增长引擎升级的前端落地全指南&#xff08;小白版&#xff09; 你有没有过这种体验&#xff1a; 打开某购物APP&#xff0c;首页正好是你最近想买的露营装备优惠&#xff1b;刚犹豫要不要下单&#xff0c;就弹出“新客首单减10元”的券&#x…

作者头像 李华
网站建设 2026/3/20 4:02:30

27、Unix 系统中的文档格式化与打印

Unix 系统中的文档格式化与打印 文档格式化系统 在处理小型简单的文本任务时,简单的文本格式化工具表现出色,但对于大型任务,Unix 系统提供了更强大的解决方案。Unix 能在技术和科学用户中流行起来,除了提供强大的多任务、多用户软件开发环境外,还在于它提供了可用于生成…

作者头像 李华
网站建设 2026/3/24 16:20:57

30、编写脚本与项目搭建入门指南

编写脚本与项目搭建入门指南 编写第一个脚本 在 Linux 系统中,编写一个简单的脚本是学习自动化任务的重要一步。让我们从一个经典的“Hello World!”脚本开始。 [me@linuxbox ~]$ echo Hello World! # This is a comment too Hello World!在这个示例中,我们使用 echo 命…

作者头像 李华
网站建设 2026/3/22 18:43:37

33、提升程序交互性:键盘输入读取与循环控制

提升程序交互性:键盘输入读取与循环控制 1. 为程序添加交互性 在编程中,许多程序缺乏与用户交互的能力。以之前的整数评估脚本为例: #!/bin/bash # test-integer2: evaluate the value of an integer. INT=-5 if [[ "$INT" =~ ^-?[0-9]+$ ]]; thenif [ "…

作者头像 李华