当前位置: 首页 > news >正文

CMake 构建系统概述

关键要点

  • 研究表明,CMake 是一种强大的跨平台构建系统,广泛用于 C++ 项目。
  • 证据倾向于认为,CMake 通过生成本地构建文件(如 Makefile、Visual Studio 项目)简化软件构建。
  • 它似乎可能支持多种平台,包括 Windows、Linux 和 macOS,适合复杂项目。
  • 存在争议,部分开发者认为其脚本语言学习曲线较陡,但社区支持广泛。

CMake 构建系统概述

什么是 CMake?
CMake 是一种跨平台构建系统生成工具,最初于 2000 年由 Kitware 公司开发,旨在解决传统构建工具(如 Make 和 autoconf)在跨平台上的局限性。它不直接编译代码,而是生成本地平台的构建文件(如 Makefile、Visual Studio 项目文件、Ninja 脚本等),方便在不同操作系统(如 Windows、Linux、macOS)上构建软件。CMake 的核心是 CMakeLists.txt 文件,用于描述项目的结构、源文件和构建设置。

如何工作?
CMake 的工作流程分为两步:

  1. 配置阶段:运行 cmake 命令,解析 CMakeLists.txt,生成适合目标平台的构建文件。
  2. 构建阶段:使用生成的构建文件(如 make 或 Visual Studio)编译和链接代码。
    它支持出源构建,将构建文件存储在独立目录(如 build/),避免污染源代码目录。

使用方法
使用 CMake 需要:

  • 创建 CMakeLists.txt,定义项目信息和目标。例如:

     

    cmake_minimum_required(VERSION 3.0.0)
    project(myApp VERSION 1.0 DESCRIPTION "一个简单的 CMake 示例" LANGUAGES CXX)
    add_executable(myApp src/main.cpp)
    target_compile_features(myApp PRIVATE cxx_std_20)

  • 在构建目录运行 cmake .. 生成文件,然后用 cmake --build . 构建项目。

优势
CMake 因其跨平台能力、依赖管理能力和社区支持而受欢迎。相比其他工具:

  • 比 Make 更强大,自动处理依赖;
  • 比 Autotools 更简单,Windows 支持更好;
  • 比 SCons 更快,比 Premake 错误报告更清晰。


详细调研笔记:CMake 构建系统的来龙去脉

CMake 构建系统是现代软件开发中不可或缺的工具,尤其在 C++ 项目中占据主导地位。以下是其定义、历史、工作原理、关键特性、使用方法和优势的详细分析,旨在为读者提供全面的理解。

1. 定义与背景

CMake 是一种跨平台的构建系统生成工具(meta-build system),由 Kitware 公司于 2000 年开发,最初是为了支持 Insight Segmentation and Registration Toolkit (ITK) 的多平台构建。它的核心目标是解决传统构建工具(如 Make 和 autoconf)在跨平台上的局限性,例如 Make 文件高度依赖平台,Windows 上需要额外的工具(如 nmake),而 autoconf 生成的脚本复杂且难以维护。

CMake 的工作方式是通过解析 CMakeLists.txt 文件,生成本地平台的构建文件(如 Unix 的 Makefile、Windows 的 Visual Studio 项目文件、Ninja 构建脚本等),然后由这些本地工具实际执行构建。它的设计理念是“一次编写,处处构建”,适合从简单项目到复杂大型项目的构建需求。

2. 历史与发展

CMake 的开发始于 1999 年,受到美国国家医学图书馆资助,旨在支持 Visible Human Project 下的 ITK 项目。2000 年,CMake 1.0 正式发布,初期功能包括依赖主机 C++ 编译器、生成 Visual Studio 和 Unix makefiles、支持构建程序、静态库和共享库等。

  • 早期发展(2000-2010)
    • CMake 1.0 发布,支持基本的项目定义和源文件管理。
    • 2006 年,CMake 2.0 发布,引入条件构建(if 语句)、变量管理和宏定义,增强灵活性。
    • 被更多项目采用,如 Visualization Toolkit (VTK) 和 ITK,功能扩展到更多平台。
  • 中期发展(2010-2014)
    • 2010 年,CMake 2.8 发布,引入对外部库的自动检测(如 find_package),简化依赖管理。
    • 2014 年,CMake 3.0 发布,标志着“现代 CMake”的开始,强调使用目标(targets)和属性(properties)取代全局变量。这使得 CMakeLists.txt 的编写更加模块化和可维护。
  • 现代发展(2014-至今)
    • 2016 年,CMake 3.7 引入对 C++ 标准库的自动链接,进一步简化 C++ 项目构建。
    • 2020 年,CMake 3.18 引入对 C++ 模块的支持,增强代码依赖管理。
    • 截至 2025 年 6 月 14 日,CMake 4.0 发布,支持替代项目文件名,方便开发者过渡。

以下表格总结了 CMake 的主要发展里程碑:

年份版本主要变化
20001.0基本项目定义和源文件管理,支持跨平台构建。
20062.0引入条件构建、变量管理和宏定义,增强灵活性。
20102.8支持外部库自动检测(如 find_package)。
20143.0强调目标和属性管理,现代 CMake 开始。
20163.7支持 C++ 标准库自动链接,简化 C++ 项目构建。
20203.18引入 C++ 模块支持,增强代码依赖管理。
20224.0支持替代项目文件名,方便开发者过渡。
3. 工作原理

CMake 的工作流程分为两个阶段:

  • 配置阶段
    • 用户运行 cmake <source_dir> 命令,CMake 解析 CMakeLists.txt,根据指定的生成器(如 Unix Makefiles、Ninja)生成本地平台的构建文件。
    • 支持出源构建,用户可以在源目录外创建构建目录(如 build/),运行 cmake .. 生成文件。
  • 构建阶段
    • 使用生成的构建文件调用本地构建工具。例如,生成 Makefile 后,可以运行 make 或 cmake --build . 编译和链接代码。
    • CMake 确保依赖关系正确,自动处理增量构建(只重新构建发生变化的部分)。
  • 关键文件:CMakeLists.txt
    • CMakeLists.txt 是 CMake 的核心配置文件,包含项目信息、源文件列表、构建目标和依赖管理。
    • 示例:

       

      cmake_minimum_required(VERSION 3.0.0)
      project(myApp VERSION 1.0 DESCRIPTION "一个简单的 CMake 示例" LANGUAGES CXX)
      add_executable(myApp src/main.cpp)
      target_compile_features(myApp PRIVATE cxx_std_20)

    • 支持分层结构,根目录的 CMakeLists.txt 可以包含子目录的 CMakeLists.txt,反映项目目录结构。
4. 关键特性

CMake 的功能强大,涵盖以下方面:

  • 跨平台支持
    • 支持生成多种平台的构建文件,包括 Windows(Visual Studio、NMake)、Linux(Make、Ninja)、macOS(Xcode)、iOS、Android 等。
    • 通过单套 CMakeLists.txt 文件实现跨平台构建。
  • 生成器(Generators)
    • 支持多种生成器,如 Unix Makefiles、Ninja、Visual Studio、Xcode、Eclipse CDT 等。
    • 用户可以通过 -G 选项指定生成器,例如 cmake -G "Unix Makefiles" ..。
  • 构建目标(Targets)
    • 支持定义可执行文件(add_executable)、静态库(add_library STATIC)、共享库(add_library SHARED)等。
    • 现代 CMake 强调使用目标属性(如 target_compile_options、target_link_libraries)而非全局变量。
  • 依赖管理
    • 通过 find_package 查找系统库或外部依赖,通过 FetchContent 下载和构建依赖。
    • 自动处理依赖关系,确保下游组件在源文件变化时重新构建。
  • 条件构建
    • 使用 if、elseif、else 等命令支持根据平台、编译器或用户选项进行条件构建。
    • 示例:
      if(WIN32)target_compile_options(myApp PRIVATE /W4)
      else()target_compile_options(myApp PRIVATE -Wall -Wextra)
      endif()

  • 模块化和可维护性
    • 现代 CMake(从 3.0 开始)建议使用目标和属性,而不是全局变量(如 CMAKE_CXX_FLAGS),提高模块化。
    • 示例:target_compile_features(myApp PRIVATE cxx_std_20) 设置 C++ 标准。
  • 包管理(Packaging)
    • 通过 CPack 工具支持生成安装包(如 .deb、.rpm、.msi),便于分发。
  • IDE 支持
    • 可以生成 IDE 项目文件,如 Visual Studio 解决方案、Xcode 项目文件、Eclipse 项目文件等。
  • 其他特性
    • 支持预编译头(从 3.6 开始)、C++ 模块(从 3.28 开始)、JSON 数据提取(从 3.19 开始)。
5. 使用方法

使用 CMake 构建项目通常涉及以下步骤:

  • 创建 CMakeLists.txt
    • 在项目根目录创建 CMakeLists.txt,定义项目信息、源文件和构建目标。
    • 示例:

       

      cmake_minimum_required(VERSION 3.0.0)
      project(myApp VERSION 1.0 DESCRIPTION "一个简单的 CMake 示例" LANGUAGES CXX)
      add_executable(myApp src/main.cpp)
      target_compile_features(myApp PRIVATE cxx_std_20)

  • 创建构建目录
    • 创建独立构建目录(如 build/),支持出源构建。
  • 运行 CMake
    • 在构建目录运行 cmake .. 生成构建文件。
    • 可通过 -G 指定生成器,例如 cmake -G "Unix Makefiles" ..。
  • 构建项目
    • 使用 cmake --build . 或调用本地工具(如 make)构建项目。
  • 安装(可选)
    • 如果定义了安装规则,可运行 cmake --install . 安装项目。
  • 基本命令
    • cmake_minimum_required(VERSION <version>):指定所需 CMake 版本。
    • project(<name> VERSION <version> DESCRIPTION "<desc>" LANGUAGES <lang>):定义项目。
    • add_executable(<name> <source_files>):创建可执行文件。
    • add_library(<name> STATIC|SHARED <source_files>):创建库。
    • target_compile_features(<target> PRIVATE <feature>):设置编译特征。
    • target_compile_options(<target> PRIVATE <options>):设置编译选项。
    • find_package(<package>):查找外部库。
    • option(<var> "<desc>" [value]):定义可选变量。
6. 优势与与其他构建系统的比较

CMake 的优势使其在现代软件开发中备受青睐:

  • 跨平台能力
    • 支持从桌面到移动设备(iOS、Android)再到高性能计算系统的多平台构建。
  • 高效和灵活
    • 自动处理依赖关系,确保只重新构建必要的部分。
    • 支持复杂的条件构建和模块化配置。
  • 与其他构建系统的比较
    • 与 Make 比较:CMake 自动处理依赖关系,而 Make 需要手动维护,适合更复杂的项目。
    • 与 Autotools 比较:Autotools 在 Windows 上表现不佳,而 CMake 更易于跨平台使用。
    • 与 SCons 比较:SCons 速度较慢,而 CMake 更高效。
    • 与 Premake 比较:Premake 的错误报告较差,而 CMake 提供更清晰的错误信息。
    • 与 Ninja 比较:Ninja 是快速构建工具,但需要 CMake 等高层工具生成输入。
    • 与 Meson 比较:Meson 专注于速度,但 CMake 在平台支持(如 iOS、Android)上更全面。
  • 社区和生态
    • CMake 是 C++ 项目的 de-facto 标准,拥有庞大的用户社区和丰富的资源。
    • 被广泛用于开源项目(如 Android NDK、Boost、KDE)和商业软件(如 Netflix、MySQL)。
7. 总结

CMake 构建系统是现代软件开发中不可或缺的工具,尤其在 C++ 项目中。它通过生成本地平台的构建文件,实现了跨平台的软件构建,同时提供了强大的依赖管理、条件构建和模块化配置能力。CMake 的发展历程从 2000 年至今,经历了从简单项目支持到复杂大型项目的演变,尤其在 2014 年后的“现代 CMake”阶段,强调了目标和属性的使用,提高了构建脚本的可读性和可维护性。

对于开发者来说,掌握 CMake 是高效管理跨平台项目的关键。通过简单的 CMakeLists.txt 文件,开发者可以轻松定义项目结构、构建目标和依赖关系,从而在不同平台上高效地构建软件。


关键引文

  • CMake 官方网站详细介绍
  • CMake Wikipedia 历史与特性
  • 现代 CMake 初学者指南
  • 构建系统概述与比较

相关文章:

  • CAD中DWG到DXF文件解析(一)
  • Linux入门(十六)shellshell变量设置环境变量位置参数变量预定义变量
  • langchain_mcp_adapters - MultiServerMCPClient 获取工具
  • 全球化2.0|云轴科技ZStack联合Teleplex举办技术沙龙 · 吉隆坡站
  • Flask文件上传与异常处理完全指南
  • 【Qt】QStateMachine状态机-对状态机分组、历史状态,实现复杂状态机
  • Git命令与代码仓库管理
  • qt中自定义控件编译成动态库
  • RabbitMQ核心函数的参数意义和使用场景
  • 深入解析JVM字节码执行引擎
  • SpringBoot自动化部署实战指南
  • 5、ZYNQ PL 点灯--流水灯
  • Android 中 OkHttp 的自定义 Interceptor 实现统一请求头添加
  • Laravel 从版本 5 到 12 每个版本都引入了一些新的特性、改进和弃用的功能
  • Android 获取签名 keystore 的 SHA1和MD5值
  • 前端构建工具(Webpack\Vite\esbuild\Rspack)拆包能力深度解析
  • TC3xx中PFLASH缓存对XCP标定常量的影响
  • 13_算法链与管道
  • 机器学习算法_支持向量机
  • Linux免驱使用PCAN,使用方法以Ubuntu为例
  • 滨海专业做网站/企业短视频推广
  • 太原哪家网站建设公司好/网络营销的模式有哪些?
  • 网站怎么做分享链接地址/搜索引擎排名优化价格
  • 实现网站开发/网站关键词优化培训
  • 网站建设相关知识/目前最好的引流推广方法
  • 做网站上传信息软件/互联网广告营销