背景
初学C/C++编译、调试和运行时,看到有GCC、Cmake、CMakeList、Make和Makefile如此多相关的工具和文件,看得一头雾水。因此想要搞懂其中的区别和关系,这样除了编辑源代码外,更能完整的从源代码开发,提升为源代码+编译+调试+运行整个项目完全实现的能力。
来源和区别
GCC
GCC(GNU Compiler Collection)是一套C语言编译器,其大大减少了程序员花费在程序编译的精力,使程序员把精力聚焦源程序本身。1985年由Richard Stallman所创,后来GCC快速发展,现在GCC除了能编译C语言,还能编译C++、Fortran、Pascal、Objective-C、Java以及Ada 等语言。它负责将源代码编译成机器码或目标文件,是底层工具链的核心部分。GCC不涉及项目构建管理,仅处理单个文件的编译和链接。
Make和Makefile
随着计算机的性能提升和普及,一个软件工程包含的源文件越来越多,比如linux,采用gcc命令逐个手动去编译,很容易混乱而且工作量大,会让人抓狂。于是乎诞生了Make和Makefile:Make是一个构建自动化工具,通过读取文件中的规则,决定哪些文件需要重新编译以及如何编译;
Makefile是Make工具的配置文件,包含构建目标、依赖关系和编译指令。这两者结合使用,减轻了工程的编译复杂度和工作量。
Makefile
Cmake和MakeList
Makefile在简单的工程中,可以通过人工手写完成,但当工程项目越来越大时,手写makefile变得越来越困难。且由于后面陆续诞生了不同平台的makefile,不同平台使用的规则不同,使跨平台编译变得非常困难。因此诞生了Cmake和MakeList。
CMake是一个跨平台的构建系统生成器,通过抽象化的配置解决Make的局限性。它不直接编译代码,而是根据生成对应平台的构建文件Makefile。
CMakeLists.txt
CMakeLists.txt是CMake的配置文件,使用声明式语法定义项目结构。
关系和协作流程
通过上面的分析,汇总各工具和文件的关系图如下:

工具链协作流程
1. CMake阶段:读取CMakeLists.txt,生成平台相关的构建文件(如Makefile)。
2. Make阶段:调用Make工具解析Makefile,确定编译顺序。
3. GCC阶段:执行实际的编译和链接命令。
















暂无评论内容