01
CMake初体验
什么是CMake?为什么现代C++项目离不开它?从一个最简单的Hello World项目开始,理解CMakeLists.txt的基本结构。
入门Hello World
02
目标导向思想
告别变量地狱,拥抱目标(Target)。理解add_executable和add_library如何定义构建目标,以及为什么这是现代CMake的核心。
核心Target
03
源文件管理
如何优雅地组织源文件?使用aux_source_directory、file(GLOB ...)以及显式列出源文件的优劣对比。
组织GLOB
04
头文件与路径
target_include_directories的正确用法。理解PUBLIC、PRIVATE、INTERFACE的区别,告别全局include_directories。
头文件可见性
05
链接库
target_link_libraries的现代用法。如何链接静态库、动态库,以及理解链接传递性。
链接传递
06
构建类型
Debug、Release、RelWithDebInfo、MinSizeRel。如何通过CMAKE_BUILD_TYPE控制编译优化和调试信息。
配置优化
07
编译选项
target_compile_options与target_compile_features。如何为特定目标设置C++标准(如C++17/20)和编译器标志。
标准特性
08
定义宏
target_compile_definitions。如何在代码中通过编译时宏控制功能开关(如DEBUG模式)。
宏开关
09
属性机制
理解CMake的属性(Properties)系统。如何通过set_property和get_property精细控制目标和目录的行为。
属性控制
10
生成器表达式
$<...>的魔法。条件编译、平台判断、配置相关逻辑,让CMake代码更智能。
表达式条件
11
接口库
INTERFACE IMPORTED库。如何创建一个纯头文件库或定义编译需求集合,实现模块化解耦。
纯头文件解耦
12
对象库
OBJECT库。如何将一组源文件编译为对象文件而不链接,用于加速大型项目的增量构建。
对象增量
13
自定义命令
add_custom_command与add_custom_target。如何集成代码生成器、协议缓冲区编译器或其他外部工具。
生成器外部工具
14
查找包
find_package详解。如何查找系统已安装的库(如Boost、OpenCV),理解MODULE与CONFIG模式的区别。
查找MODULE/CONFIG
15
编写Config文件
如何为你的库编写XXXConfig.cmake,让其他项目可以通过find_package轻松使用。
Config导出
16
安装规则
install命令详解。如何安装目标、头文件、可执行文件,以及生成正确的导出目标。
安装导出
17
导出目标
export与install(EXPORT)。如何将构建树中的目标导出,供其他项目直接引用,无需安装。
export构建树
18
子目录与嵌套项目
add_subdirectory的用法。如何组织多模块项目,控制作用域和变量传递。
子目录模块
19
FetchContent
现代依赖管理。如何从GitHub自动下载并构建第三方库,告别手动下载和git submodule。
依赖自动
20
CPack打包
如何使用CPack将你的项目打包成安装程序(如NSIS、DEB、RPM)。
打包安装包
21
CTest测试
集成测试框架。如何使用enable_testing和add_test,以及配合Google Test进行单元测试。
测试Google Test
22
CDash持续集成
如何将CTest结果上传到CDash仪表盘,实现跨平台的构建与测试监控。
CI仪表盘
23
工具链文件
交叉编译入门。如何编写Toolchain.cmake,为ARM、RISC-V等嵌入式平台构建代码。
交叉编译嵌入式
24
预设文件
CMakePresets.json。如何统一团队的构建配置,简化命令行操作。
预设团队
25
依赖图可视化
使用--graphviz选项生成依赖图。如何分析项目结构,发现循环依赖。
可视化依赖图
26
性能优化
如何通过Unity Build、预编译头文件(PCH)等手段加速CMake项目的构建速度。
加速PCH
27
IDE集成
如何配置CMake以生成Visual Studio、Xcode、CLion等IDE的项目文件,以及使用CMAKE_EXPORT_COMPILE_COMMANDS。
IDEcompile_commands
28
模块化设计
实战案例——将一个大型单体项目拆分为多个可复用的库目标,并设计清晰的依赖关系。
重构复用
29
版本管理
如何在CMake中管理项目版本号,并通过版本文件(Version.cmake)实现语义化版本控制。
版本语义化
30
综合实战
从零搭建一个现代C++项目框架,集成Google Test、spdlog、CLI11,并支持安装与导出。
实战框架