news 2025/12/27 18:18:28

【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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/14 15:34:33

35、RAID 系统迁移与管理全攻略

RAID 系统迁移与管理全攻略 1. RAID 基础管理 在 RAID 系统中,如果需要更换磁盘,可按以下步骤操作: - 用新磁盘替换旧磁盘,并对新磁盘进行分区。要确保新分区的大小等于或大于 RAID 阵列中其他分区。 - 新分区准备好后,使用 --add 命令将其添加到阵列: $ sudo md…

作者头像 李华
网站建设 2025/12/14 15:34:23

37、构建高可用Linux集群:Heartbeat实战指南

构建高可用Linux集群:Heartbeat实战指南 在服务器运行过程中,即使主机配备了RAID和以太网绑定,仍有许多组件可能出现故障,从CPU到主机上的软件都有可能。若要确保服务在主机故障时仍能正常运行,就需要构建集群。本文将介绍基本Linux集群中常用的工具Heartbeat,并详细说明…

作者头像 李华
网站建设 2025/12/14 15:34:19

38、构建高可用集群:Heartbeat与DRBD实战指南

构建高可用集群:Heartbeat与DRBD实战指南 1. 集群准备与Heartbeat简介 在集群搭建过程中,当完成故障转移(fail back)相关操作后,集群就可以进行剩余的测试,适当调整超时设置,随后便可投入实际使用。之前的示例为搭建自己的集群服务提供了一个良好的开端,但它并未涵盖…

作者头像 李华
网站建设 2025/12/15 23:09:20

46、Linux 实用命令与技巧大揭秘

Linux 实用命令与技巧大揭秘 在 Linux 系统的使用过程中,掌握一些实用的命令和技巧能让我们的工作更加高效。下面将为大家详细介绍一系列实用的 Linux 命令及操作方法。 命令路径快捷查找 有时候,我们想查看二进制路径下的某个 shell 脚本,但却记不清它具体位于 /bin 、…

作者头像 李华
网站建设 2025/12/14 15:29:46

25、Ubuntu 网络应用全攻略

Ubuntu 网络应用全攻略 1. Firefox 浏览器使用技巧 Firefox 支持标签式窗口,提供了多种打开新标签的方式: - 点击“New Tab”按钮(现有标签右侧的“+”符号)。 - 按住“Ctrl”键并点击链接,可在新标签中打开。 - 按下“Ctrl - T”组合键。 - 若鼠标有中键,有时点击…

作者头像 李华
网站建设 2025/12/14 15:29:40

26、开启Ubuntu系统下OpenOffice.org的高效办公之旅

开启Ubuntu系统下OpenOffice.org的高效办公之旅 在Ubuntu系统中,我们可以借助网络完成许多操作。若想使用的程序或功能未被提及,可通过Synaptic软件包管理器或Ubuntu软件中心进行搜索,大概率能找到所需的程序或具有类似功能的替代程序。 而开源软件强大功能与能力的一个绝…

作者头像 李华