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