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 项目?适合学习大型项目怎么管理。

相关推荐
十五年专注C++开发1 天前
CMake基础:条件判断详解
c++·跨平台·cmake·自动化编译
mrbone113 天前
Git-git worktree的使用
开发语言·c++·git·cmake·worktree·gitab
stonewu14 天前
Cmake入门及CMakeLists.txt 语法介绍
c++·cmake
不知所云,15 天前
QT vscode cmake 编译 undefined reference to `vtable for 问题解决
vscode·qt·cmake
不想被吃掉氩16 天前
CMAKE
windows·unix·cmake
咩咩大主教18 天前
2025最新版使用VSCode和CMake图形化编译调试Cuda C++程序(保姆级教学)
c++·vscode·cmake·visual studio·cuda·cpp·cuda c++
十五年专注C++开发18 天前
CMake实践:指定gcc版本编译和交叉编译
linux·开发语言·c++·cmake·自动化编译
十五年专注C++开发22 天前
Qt .pro配置gcc相关命令(三):-W1、-L、-rpath和-rpath-link
linux·运维·c++·qt·cmake·跨平台编译
old_power1 个月前
在 Windows 系统下配置 VSCode + CMake + Ninja 进行 C++ 或 Qt 开发
c++·windows·vscode·cmake·ninja