CMake 原理深度解析:从脚本到可执行文件的完整旅程

CMake 原理深度解析:从脚本到可执行文件的完整旅程 CMake 不难,难的是不知道它在干什么。这篇文章的目标就是把黑盒变白盒。 写在前面 大多数人学 CMake 的路径是:搜到一份 CMakeLists.txt,改改能用就行,出了问题就再搜。结果用了好几年,遇到稍微复杂一点的场景(比如交叉编译、多配置、发布库)就卡住了。 根本原因是没有建立原理模型——不知道 CMake 执行 cmake -B build 时到底发生了什么,project()、target_link_libraries() 这些命令在内部做了什么。 这篇文章就是要填这个坑。 前置要求:用过 CMake 写过几行命令,知道"能编译就行"是什么感觉。 一、CMake 是什么?(真正的答案) 1.1 一句话定义 CMake 是一个元构建系统(Meta Build System),它不直接编译代码,而是生成其他构建系统的配置文件。 这句话很关键,很多人把 CMake 当编译器用,但它跟编译器没有任何直接关系。 1.2 构建工具链全景 一个 C++ 项目从源码到可执行文件,经历了这些工具: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 你写的代码 │ ▼ CMakeLists.txt(你告诉 CMake 项目结构是什么) │ ▼ cmake -B build(配置 + 生成) │ ├── Linux/macOS → Makefile 或 build.ninja ├── Windows → Visual Studio .sln + .vcxproj 或 build.ninja └── macOS → Xcode .xcodeproj │ ▼ cmake --build build(或直接 make / ninja / msbuild) │ ├── 编译器(gcc / clang / MSVC cl.exe) │ → .cpp → .o(目标文件) │ └── 链接器(ld / lld / link.exe) → .o + .a/.lib → 最终的可执行文件或库 类比:CMake 就像建筑师画的图纸(蓝图)。施工队(make/ninja)按图纸干活,工人(编译器)才是真正拿锤子的人。图纸本身不盖楼。 ...

June 2, 2025 · 17 min · 3506 words

现代 CMake 课程学习:从「面向目录」到「面向目标」

现代 CMake 课程学习:从「面向目录」到「面向目标」 现代 CMake 不是新语法,是新思维。 写在前面 这篇文章适合谁? 用过 CMake 但只会 add_executable + target_link_libraries 的人 从 Makefile / Visual Studio 工程迁移过来,想系统学 CMake 的人 看别人 CMakeLists.txt 里一堆 PUBLIC、$<BUILD_INTERFACE:...> 一头雾水的人 什么是 CMake?(30 秒版本) CMake 不是编译器,它是一个构建系统生成器。你写一份 CMakeLists.txt,CMake 帮你生成对应平台的构建文件: Linux → Makefile 或 Ninja Windows → Visual Studio .sln 或 Ninja macOS → Xcode 或 Ninja 类比:CMake 就像一个"翻译官",你用一种语言描述"我要编译什么",它翻译成各平台编译器能理解的指令。 为什么要学"现代" CMake? CMake 从 2000 年诞生至今,经历了巨大变化。2014 年的 CMake 3.0 是分水岭——引入了 target-based(面向目标)设计。此后的版本持续完善这套体系。 如果你还在用 include_directories()、link_libraries() 这套"传统写法",那你用的是 2014 年之前的思路——就像 2025 年还在写 C++98 一样。 ...

June 1, 2025 · 15 min · 3155 words