@bit::Shadow
✧(≖ ◡ ≖✿
目录
[cmake .生成的文件们](#cmake .生成的文件们)
CMakeFiles文件夹(临时文件仓库,最庞大但最不关心)
学CMake为什么"有必要"?(三个现实原因)
-
行业硬门槛(逃不掉) :GitHub上绝大多数C++项目(如LLVM、OpenCV、TensorFlow)都用CMake构建。如果你想阅读源码、给项目提PR,或者在公司接手遗留代码,第一关就是看懂
CMakeLists.txt。看不懂,连项目都打不开,更别说修改了。 -
跨平台的"翻译官" :你的代码可能在Windows(VS)、Linux(Make)、macOS(Xcode)上跑。CMake不是编译器,而是生成器 ------它根据不同平台生成对应的构建文件。你只需要写一次
CMakeLists.txt,就能在所有主流IDE里打开,这极大节省了配环境的时间。 -
依赖管理(现代C++的刚需) :C++没有官方的包管理器,但现代CMake(3.15+)的
find_package和FetchContent功能,能让你像写Python的pip一样引入第三方库(比如fmt、spdlog、OpenCV)。不用CMake的话,手动配置包含路径和链接库会非常繁琐。
CMake版本号 3.22.1

CMakeLists.txt构建
目标文件以test.cc为例
cpp
#include <iostream>
#include<unistd.h>
int main()
{
for (int i = 1; i < 4; i++)
{
sleep(1);
std::cout << i << std::endl;
}
return 0;
}
文件创建
命名:规范命名是CMakeLists.txt 。(C M L可大小写切换但是后缀"s"必带)

内容构建
基本分为三部分
bash
#cmake
# 1 限制最低版本号
cmake_minimum_required(VERSION 3.18) #没有"句号"
# 2 设置项目名称
project(FirstProjext)
# 3 设置构建目标
add_executable(pc test.cc)
最低版本号(必做)
cmake_minimum_required()
低于版本号不行(报错),大于等于才可以构建。
设置项目名字(必做,最直观,但最不重要)
project()
-
作用 :设置
PROJECT_NAME变量,方便你在日志或输出文件中引用。 -
例子 :
message("Building ${PROJECT_NAME} version ${PROJECT_VERSION}")会输出 "Building MyApp version 1.0.0"。 -
价值 :如果你的项目有多个子模块,用
PROJECT_NAME做前缀生成输出文件(如${PROJECT_NAME}.exe),避免硬编码。
设置构建目标(必做)
add_executable()
类似于可变参数,第一部分是生成目标,第二部分是依赖对象test.cc
终端执行CMakeLists.txt
cmake .形成的文件图

cmake .生成的文件们

CMakeFiles文件夹(临时文件仓库,最庞大但最不关心)
-
它是什么 :一个**"杂物间"**,里面包含:
-
每个源文件的编译依赖信息(
.d文件) -
编译时的临时
.o文件(在某些子目录) -
CMake内部的状态文件(比如
CMakeOutput.log和CMakeError.log用于记录探测过程)
-
-
你的任务 :你永远不需要手动翻这个文件夹。不过有两个小技巧:
-
如果编译报错提示"找不到头文件",可以翻一下里面的
CMakeError.log,看CMake在探测系统库时遇到了什么错误(高级调试)。 -
清理构建时,直接删除整个
CMakeFiles文件夹和CMakeCache.txt,比手动挑文件快得多。
-
CMakeCache.txt(缓存文件,故障排查)
功能:存储探测编译系统内容属性等、重复执行cmake .检测此缓冲文件适当更改原先cmake .形成的框架内的文件内容。
什么时候需要手动操作:从Debug切换到Release,解决"编译时"的90%诡异问题(删除该缓存文件后重新生成)。
cmake_install.cmake(安装脚本)
执行安装相关命令(例如指令:make install)
若删除部分cmake生成的文件再次cmake .就会重新生成其中CMakeCache就起到了缓存作用提高效率。
删除Makefile后,重新构建:

执行make

运行.exe

感谢支持,长期连载
欢迎关注
