CMake处理项目流程(处理项目时究竟干了些什么事情)

总体流程

CMake 的流程有以下的步骤
[Pasted image 20240107134748.png]
了解过程会更好地帮助我们去理解整个 cmake 在干什么,debug 的时候更容易去定位错误

例如当对于任意合法的 CMakelist.txt 执行 cmake --build .
Configuring done 配置完成
Generating done 生成完成
Build files have been written to… 构建文件已写入…(说明构建成功)
[Pasted image 20240107134926.png]
如果构建不合法则会出现
[Pasted image 20240107160422.png]
如果是配置和生成出现错误,那么就一定是 CMake 配置或 CMakelist 配置没有配置好

编译过程

事实上,CMake 只是处理配置和生成两个阶段,换一句话说 CMake 的配置和生成都是 cmake 自己的事情,而到了编译阶段则是调用其他的工具来进行编译 CMake 可以通过特定的命令(如 cmake --build .)来调用这些工具,但本质上它是在为这些工具提供参数,实际的编译工作是由那些如 make, ninja 工具完成的。(区分好各司什么职很重要)

以下是编译过程:

[textgif 1.gif]

[Pasted image 20231223205158.png]
[Pasted image 20231223205452.png]
[Pasted image 20231223205647.png]
接下来我们通过 g++来来看看具体是怎么样处理的

预处理

g++ -E main.cpp -o main.i 预处理
[Pasted image 20231223211045.png]
[Pasted image 20231223211312.png]

编译

g++ -S main.i -o main.s 编译
[Pasted image 20231223211523.png]
[Pasted image 20231223211601.png]

经过预处理和编译我们得到如下文件
[Pasted image 20231223211751.png]
这些也不必去全部一步一步进行,可以直接走最后一步从而走完全部过程
如下,但是只会得到最后的 .o 文件
[Pasted image 20231223212517.png]
[Pasted image 20231223212456.png]

汇编

g++ -c add.s -o add.o
[Pasted image 20231223213434.png]
汇编成机器码文件

链接

g++ main.o add.o -o main
[Pasted image 20231223213737.png]

总结

CMake .c.cpp 文件,在预处理阶段会引入 .h 文件生成包含所有需要的代码 .i 文件,经过编译生成汇编语言构成的 .s 文件,再汇编成目标所需的机器码 .o 文件,将 .o 文件集体打包就是 .a 静态库文件/ . So 动态库文件,最后链接成 无后缀/.out 的可执行文件

描述 Linux 后缀 Windows 后缀
汇编源文件 . S 或 .S . Asm
C/C++ 源文件 . C / .cpp . C / .cpp 或 .cc
C/C++ 头文件 . H . H
目标文件 . O . Obj
静态库文件 . A . Lib 或 .a
动态库/共享库文件 . So . Dll
可执行文件 *(无后缀) 或 .out . Exe
脚本文件 *(无后缀) 或 .sh . Bat 或 .ps 1
CMake 配置文件 CMakeLists. Txt CMakeLists. Txt
CMake 缓存文件 CMakeCache. Txt CMakeCache. Txt