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

CMake是什么

CMake 是一个 跨平台的构建系统生成工具,它不直接构建(编译)你的代码,而是用来生成各种平台下的构建系统(如 Makefile、Visual Studio 工程文件、Xcode 工程等)。

🧠 一句话理解:

CMake 就像一个“编译配置脚本生成器”,你告诉它项目结构和依赖,它帮你生成编译系统。

🧩 为什么需要 CMake?

在现代 C++ 项目中,你可能需要:
• 管理多个源文件和头文件;
• 使用第三方库(Boost, OpenCV, JSON 等);
• 支持多平台(Linux、Windows、macOS);
• 分 Debug / Release 构建;
• 支持自动测试、安装、打包;
• 管理子模块、子库、插件系统…

用传统的 Makefile 管理这些非常复杂。CMake 提供了一套 统一、跨平台、模块化、声明式 的语法,解决这些问题。

⚙️ CMake 的工作机制(图示理解)

你写的 CMakeLists.txt +→ cmake → 生成构建系统 (Makefile / Ninja / .sln / Xcode)

构建工具(如 make、ninja、MSBuild)→ 编译/链接生成可执行文件或库

🔑 CMake 做了什么事?

功能 描述
项目描述 声明项目名、版本、语言、标准(如 C++17)
源文件管理 自动管理多文件、子目录
构建目标 声明可执行文件、静态库、动态库
依赖管理 通过 find_package()、FetchContent 下载和使用外部库
构建配置 支持 Debug / Release / RelWithDebInfo / MinSizeRel
跨平台支持 可生成不同系统的构建系统
安装与打包 通过 install() 定义安装路径
单元测试 通过 enable_testing() 和 add_test() 集成测试框架
导出和复用 支持导出库供其他项目使用(export / install config)

🧪 示例:从零开始写一个最小的 CMake 项目

📁 项目结构:

HelloCMake/
├── CMakeLists.txt
└── main.cpp

📝 main.cpp

#include
int main() {
std::cout << “Hello, CMake!” << std::endl;
return 0;
}

📜 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(HelloCMake)

set(CMAKE_CXX_STANDARD 17)

add_executable(hello main.cpp)

🚀 编译并运行

mkdir build
cd build
cmake …
make
./hello

🎯 CMake 的几个核心概念

名称 解释
project() 定义项目名和语言
add_executable() 编译一个可执行程序
add_library() 编译一个静态/动态库
target_link_libraries() 链接外部库或目标
include_directories() 添加头文件搜索路径
find_package() 查找系统中安装的第三方库
FetchContent 下载/嵌入第三方库源码
add_subdirectory() 组织大型项目(子模块)
install() 定义安装路径和文件
option() 定义构建选项(可开关)

🧰 举个更实用的例子:使用第三方库

find_package(OpenCV REQUIRED)
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE ${OpenCV_LIBS})

🎁 CMake 的好处总结

优点 描述
📦 跨平台 一套代码,Windows / Linux / macOS 通用
📚 第三方库集成简单 自动查找和链接外部库
🧱 结构清晰 支持模块化、子项目、子库
🧪 集成测试支持 可以运行测试用例
🔧 多构建系统支持 可以生成 Makefile、Ninja、Xcode、Visual Studio 工程
🎯 可复用性强 可构建静态库/动态库供其他项目引用
🔄 支持持续集成 易于集成到 CI/CD 系统中

🧑‍💻 你接下来可以做的:
1. 手动写一个 main.cpp + CMakeLists.txt 跑一下;
2. 用 CMake 管理一个小型 JSON 解析项目(我刚给你的示例);
3. 想学复杂的,可以尝试:构建静态库 + 动态库 + 测试模块;
4. 想集成到 VSCode、CLion 的我也可以指导你配置调试环境。

是否需要我手把手帮你写一个带子模块、多个源文件、测试和配置选项的 CMake 项目?适合学习大型项目怎么管理。

http://www.dtcms.com/a/267296.html

相关文章:

  • NV183NV185美光固态闪存NV196NV201
  • 供应链管理-采购管理:国际贸易及支付领域中常见的支持方式
  • FLUX.1-Kontext 高效训练 LoRA:释放大语言模型定制化潜能的完整指南
  • 软件版本FCCU(故障采集与控制单元)设计
  • 如何选择不会降低网站速度的WordPress主题
  • 动手实践OpenHands系列学习笔记11:现代开发流程
  • C#指针:解锁内存操作的底层密码
  • DVWA靶场通关笔记-验证码绕过reCAPTCHA(Medium级别)
  • 网安系列【6】之[特殊字符] SQL注入揭秘:从入门到防御实战指南
  • cloudflare配合github搭建免费开源影视LibreTV一个独享视频网站 详细教程
  • React Native 亲切的组件们(函数式组件/class组件)和陌生的样式
  • 百度开源文心一言4.5:论文解读和使用入门
  • 闲庭信步使用SV搭建图像测试平台:第三十二课——系列结篇语
  • 【学习笔记】MySQL技术内幕InnoDB存储引擎——第5章 索引与算法
  • MySQL(118)如何使用SSL进行加密连接?
  • 前端进阶之路-从传统前端到VUE-JS(第三期-VUE-JS配套UI组件的选择)(Element Plus的构建)
  • vscode remote-ssh 拓展免密访问 linux虚拟机
  • 二分查找,乘法口诀表,判断闰年,判断素数,使用函数实现数组操作
  • CSS02:四种CSS导入方式
  • 动手实践OpenHands系列学习笔记7:前端界面设计
  • Flyway 介绍以及与 Spring Boot 集成指南
  • CppCon 2018 学习:Surprises In Object Lifetime
  • Linux systemd 服务启动失败Main process exited, code=exited, status=203/EXEC
  • xformers--Transformer优化加速器使用
  • 暑假算法日记第一天
  • App爬虫工具篇-appium配置
  • Spring Boot中POST请求参数校验的实战指南
  • bean注入的过程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘
  • 虚拟机网络编译器还原默认设置后VMnet8和VMnet1消失了
  • 第三方软件测试费用受啥影响?规模和测试类型了解下?