news 2026/4/28 16:13:00

cmake_第二章 CMake基础语法_cmake生成器,cmakegui构建和add_subdirectory()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cmake_第二章 CMake基础语法_cmake生成器,cmakegui构建和add_subdirectory()

文章目录

  • 第二章 CMake基础语法
    • 2.1 CMake构建系统生成器
      • 2.1.1 问题分析
      • 2.1.2 使用生成器生成不同类型的编译文件
      • 2.1.3 代码演示
    • 2.2 使用cmake-gui构建第一个项目
    • 2.3 CMake子目录处理 add_subdirectory()
      • 2.3.1 基本语法
      • 2.3.2 代码演示
      • 2.3.3 测试 add_subdirectory 选项

本文介绍cmake第二章,cmake生成器,cmakegui构建和add_subdirectory()

第二章 CMake基础语法

2.1 CMake构建系统生成器

2.1.1 问题分析

在CMake3.31中,CMake 默认生成 VS2022 所需要的项目文件。但如果需要生成 VS2017项目怎么办? 或者在CMake4.2.X中,默认生成的VS2026的项目文件,想生成VS2022的项目文件怎么版?CMake 默认帮我生成 make 所需要的Makefile,但我的项目是ninja构建的需要是build.ninja?
如何让cmake生成我想要的文件?

2.1.2 使用生成器生成不同类型的编译文件

CMake生成器((Generator)负责为本机构建系统编写输入文件,CMake 生成器是特定于平台的,某个生成器可能仅在某些平台上可用。
执行cmake之前,我们必须为构建树指定CMake 生成器以确定要使用哪种本机构建系统。使用cmake -G选项指定新构建树的生成器。
-G 后面跟的是生成器的名称(字符串)。它告诉 CMake:“请为这个特定的工具生成配置文件”。 注意:如果不指定 -A,默认通常是 x64,但有时需要显式指定架构,如 :

cmake -G"Visual Studio 17 2022"-A x64

不同的生成器:cmake -G 选项可以查看生成器:可以看到默认是vs2022。

查看Linux下默认的生成器:

生成器说明:

2.1.3 代码演示

在windows下,使用-G生成器,告诉CMake,我要使用VS2022开发。

cmake -S.-B build -G"Visual Studio 17 2022"然后使用: cmake --build build

ninja 生成器:需要提前安装ninja

cmake -B build21 -G"Ninja"


2.2 使用cmake-gui构建第一个项目

cmake-gui 是CMake的图形化窗口工具。用户可以在界面上进行项目配置设置,程序运行时,窗口底部会提供简要说明。
使用CMAKE-GUI进行编译:

点击 Finish之后,如下图所示:

然后查看build 目录,发现目录中多了 CMakeCache.txt文件和 CMakeFiles文件。CMakeCache.txt中保存了项目配置的各种信息,这些变量可以在配置过程中修改,以适应不同的构建需求。

然后,再次点击Generate 后,生成的VS2022的项目文件:

然后点击open按钮,直接使用vs2022打开生成的文件。

在后在vs2022中点击生成,即可生成可执行文件。

2.3 CMake子目录处理 add_subdirectory()

当你的项目变得庞大,不能把所有代码都堆在一个文件夹里时,你会将代码拆分到不同的子文件夹中(例如 src, lib, tests)。add_subdirectory 就是用来把这些子文件夹里的构建逻辑连接起来的。
add_subdirectory()作用就是指定CMake进入指定的子目录下,找到CMakeLists.txt文件,并执行它。

2.3.1 基本语法

add_subdirectory(source_dir[binary_dir][EXCLUDE_FROM_ALL])source_dir :这是必填项,包含CMakeLists.txt文件的子目录名称。[binary_dir]: 可选项,指定该子目录编译输出的中间文件存放路径(通常不需要填,默认会保持和源码目录结构一致)。[EXCLUDE_FROM_ALL]:选填,如果加上这个选项,默认编译时,不会编译这个目录。但是如果加上了这个选项,同时,项目中使用了这个子目录生成的库,子目录仍会被编译。

2.3.2 代码演示

在子目录下面编译一个静态库,然后在主程序中使用这个静态库。
文件目录如下:

第一步: 编写子目录下的CMakeLists.txt

cmake_minimum_required(VERSION3.10)project(MathLib)# 创建一个名为 MathLib 的静态库,包含 Math.cpp 文件add_library(MathLib STATIC MyMath.cpp)# 如果其他地方要用这个库,最好指定头文件路径target_include_directories(MathLib PUBLIC${CMAKE_CURRENT_SOURCE_DIR})

第二步:编写根目录下的CMakeLists.txt

cmake_minimum_required(VERSION3.10)project(MyProjectSubdirectory)# 1 添加子目录 mathlibadd_subdirectory(mathlib)# 2 创建根目录的可执行文件add_executable(MyProjectSubdirectory main.cpp)# 3 将MathLib 库链接到可执行文件target_link_libraries(MyProjectSubdirectory PUBLIC MathLib)


探究上面cmake的执行顺序:当执行主目录下的cmake时,遇到add_subdirectory(mathlib)后,如下步骤:

  1. 暂停处理当前的 CMakeLists.txt。
  2. 进入 mathlib 目录,处理那里的 CMakeLists.txt。
  3. 处理完毕后,返回上一级,继续执行剩下的命令。

2.3.3 测试 add_subdirectory 选项

加上build 的作用:告诉cmake,子目录编译文件单独放在一个build文件中。

# 1 添加子目录 mathlibadd_subdirectory(mathlib build EXCLUDE_FROM_ALL)

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

AI大模型应用谱系与流行度排名研究

人工智能大模型技术自 2017 年 Transformer 架构诞生以来,经历了从技术突破到商业爆发的快速演进。当前,AI 大模型已成为推动各行业数字化转型的核心引擎,其应用涵盖了从基础的语言理解到复杂的多模态生成等广泛领域。本研究旨在梳理 AI 大模…

作者头像 李华
网站建设 2026/4/22 23:04:03

Kotaemon支持多种Embedding模型切换,灵活性拉满

Kotaemon支持多种Embedding模型切换,灵活性拉满 在构建智能问答系统时,我们常常面临一个现实问题:同一个Embedding模型,很难同时满足高精度、低成本、多语言和低延迟的全部需求。比如,在金融场景中,用户提问…

作者头像 李华
网站建设 2026/4/23 15:50:53

EmotiVoice在语音日记应用中的个性化表达实现

EmotiVoice在语音日记应用中的个性化表达实现 在一个人越来越依赖数字方式记录情绪的时代,写日记早已不再是纸笔之间的私密对话。从早年的博客到如今的语音备忘录,人们渴望的不仅是“被听见”,更是“被理解”。然而,当AI朗读你的文…

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

AOP(面向切面编程)在 JS 中:如何无侵入地通过装饰器添加日志与埋点

AOP(面向切面编程)在 JavaScript 中:如何无侵入地通过装饰器添加日志与埋点 各位开发者朋友,大家好!今天我们来深入探讨一个非常实用又优雅的技术主题:如何在 JavaScript 中使用 AOP(面向切面编程)实现无侵入式的日志记录和埋点功能。 如果你曾经遇到过这样的问题: …

作者头像 李华
网站建设 2026/4/24 0:26:58

防腐层(Anti-Corruption Layer)设计:隔离遗留代码与新架构

防腐层(Anti-Corruption Layer)设计:隔离遗留代码与新架构 大家好,我是你们今天的讲师。今天我们来聊一个在现代软件工程中越来越重要的概念——防腐层(Anti-Corruption Layer, ACL)。如果你正在从旧系统迁移到微服务、模块化架构或云原生应用,那么你一定会遇到这样一个…

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

SQLite Wasm:在浏览器中运行完整的 SQL 数据库并持久化到 OPFS

SQLite Wasm:在浏览器中运行完整的 SQL 数据库并持久化到 OPFS 大家好,欢迎来到今天的专题讲座!今天我们不聊前端框架或状态管理,也不讲 React 或 Vue 的新特性。我们来聊聊一个可能你还没怎么接触过、但非常强大且实用的技术:如何在浏览器中使用 SQLite WebAssembly(Wa…

作者头像 李华