GCC、G++、CMake、Make、QMake 和 CMakeLists.txt这一系列的名词对于初学c++的学者来说是不是听起来很迷茫,但是又在很多的项目中遇到过?今天我们来简短的介绍一下这些专有名词,并且搞懂他们之间的关联。
1. GCC (GNU Compiler Collection)
本质:编译器
作用:
- 将源代码(.c/.cpp)转换为机器可执行文件
 - 处理编译过程的4个阶段:
- 预处理(宏展开、头文件包含)
 - 编译(源代码 → 汇编代码)
 - 汇编(汇编代码 → 机器码)
 - 链接(合并多个目标文件和库)
 
 
特点:
- 支持多种语言(C, C++, Objective-C, Fortran等)
 - 跨平台(Linux/Windows/macOS)
 - 提供丰富的编译选项(优化级别、警告控制等)
 
使用示例:
1
2gcc -c main.c -o main.o # 编译C文件
g++ -Wall -O2 app.cpp -o app # 编译C++文件并优化
2. G++
本质:C++前端编译器
作用:
- GCC的C++特定版本
 - 自动链接C++标准库(libstdc++)
 - 处理C++特有的编译特性(模板、异常处理等)
 
与GCC的关系:
- G++是GCC的一部分,专注于C++编译
 - 相当于
gcc -lstdc++的快捷方式 
使用示例:
1
g++ -std=c++17 main.cpp utils.cpp -o app
3. Make
本质:构建自动化工具
作用:
- 根据Makefile规则管理构建过程
 - 自动检测需要重新编译的文件(增量编译)
 - 执行编译命令(调用gcc/g++)
 
核心概念:
- 目标(targets)
 - 依赖(dependencies)
 - 命令(commands)
 
Makefile示例:
1
2
3
4
5
6
7
8
9
10
11app: main.o utils.o
g++ main.o utils.o -o app
main.o: main.cpp
g++ -c main.cpp
utils.o: utils.cpp utils.h
g++ -c utils.cpp
clean:
rm -f *.o app特点:
- 简单直接
 - 需要手动管理依赖关系
 - 跨平台性有限
 
4. QMake
本质:Qt专用的构建系统生成器
作用:
- 解析.pro文件
 - 生成平台特定的构建文件(Makefile或IDE项目文件)
 - 自动处理Qt特有的构建步骤(moc, uic, rcc)
 
.pro文件示例:
1
2
3
4
5QT += widgets
TARGET = myapp
SOURCES += main.cpp widget.cpp
HEADERS += widget.h
RESOURCES += app.qrc特点:
- Qt原生支持
 - 简单易学
 - 跨平台(生成不同平台的构建文件)
 - 功能相对有限(相比CMake)
 
5. CMake
本质:跨平台构建系统生成器
作用:
- 解析CMakeLists.txt文件
 - 生成平台特定的构建系统文件:
- Linux/macOS → Makefile
 - Windows → Visual Studio解决方案(.sln)
 - Ninja → build.ninja
 
 - 自动检测系统环境和依赖库
 
核心优势:
- “Write once, build everywhere”
 - 支持复杂项目结构
 - 强大的依赖管理
 - 模块化系统
 
使用流程:
1
2
3mkdir build && cd build
cmake .. # 生成构建系统
make # 执行构建
6. CMakeLists.txt
本质:CMake的配置文件
作用:
- 描述项目结构和构建规则
 - 定义编译目标(可执行文件、库)
 - 指定依赖关系和链接选项
 
示例:
1
2
3
4
5
6
7
8
9
10
11
12cmake_minimum_required(VERSION 3.10)
project(MyApp)
add_executable(myapp main.cpp)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
target_link_libraries(myapp PRIVATE Qt5::Widgets)
set_target_properties(myapp PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED ON
)
工具链对比分析
层级关系
1  | [源代码]  | 
功能对比表
| 工具/文件 | 主要作用 | 输入 | 输出 | 跨平台性 | 复杂度 | 适用场景 | 
|---|---|---|---|---|---|---|
| GCC/G++ | 编译源代码 | 源代码文件 | 目标文件/可执行文件 | 高 | 低 | 简单程序、单文件编译 | 
| Make | 执行构建规则 | Makefile | 构建产物 | 中 | 中 | 中小型项目 | 
| QMake | 生成Qt项目构建系统 | .pro文件 | Makefile/项目文件 | 高 | 中 | Qt项目 | 
| CMake | 生成跨平台构建系统 | CMakeLists.txt | 构建系统文件 | 极高 | 高 | 大型跨平台项目 | 
| CMakeLists.txt | 描述项目构建规则 | 无 | 无 | 极高 | 高 | 所有CMake项目 | 
工作流程对比
简单项目:
1  | main.cpp → g++ → a.out  | 
Make项目:
1  | main.cpp + utils.cpp + Makefile → make → (g++) → app  | 
QMake项目:
1  | main.cpp + widget.cpp + app.pro → qmake → Makefile → make → (g++) → app  | 
CMake项目:
1  | main.cpp + utils.cpp + CMakeLists.txt → cmake → Makefile → make → (g++) → app  | 
现代C++项目推荐工作流
对于Qt项目
关键配置示例
Qt项目的CMakeLists.txt:
1  | cmake_minimum_required(VERSION 3.16)  | 
如何选择构建工具?
小型工具/快速原型:
- 直接使用G++编译
 - 或简单Makefile
 
Qt专用项目:
- 传统:QMake + .pro文件
 - 现代:CMake(Qt官方推荐)
 
跨平台C++库/应用:
- CMake(行业标准)
 
大型复杂系统:
- CMake + 现代构建系统(如Ninja)
 
常见问题解答
Q:CMake能完全替代Make吗?
A:不完全。CMake生成Makefile,然后Make执行构建。CMake是构建系统生成器,Make是构建执行器。
Q:QMake会被淘汰吗?
A:Qt官方已转向CMake作为首选构建系统,但QMake仍被广泛使用,特别是维护旧项目时。
Q:为什么需要构建系统?
A:当项目具有以下特点时:
- 多个源文件
 - 复杂的依赖关系
 - 需要跨平台构建
 - 包含资源文件和代码生成
 - 需要安装规则和打包
 
Q:GCC和Clang的区别?
A:两者都是编译器,GCC是GNU项目,Clang是LLVM项目。Clang有更友好的错误信息,更快的编译速度,更好的C++标准支持。
总结
- 编译器层:GCC/G++ 负责将源代码转换为机器码
 - 构建执行层:Make 负责执行构建规则
 - 构建系统生成层:
- QMake:专为Qt优化的构建系统生成器
 - CMake:通用跨平台构建系统生成器
 
 - 配置文件:
- .pro:QMake的配置文件
 - CMakeLists.txt:CMake的配置文件
 
 
现代C++开发中,CMake + GCC/Clang + Ninja 已成为主流组合,提供最高效、最灵活的构建解决方案。对于Qt项目,虽然QMake仍可用,但CMake已成为官方推荐的选择,特别是新项目。
- 本文作者: 迪丽惹Bug
 - 本文链接: https://lyroom.github.io/2025/09/05/构建工具链深度解析:GCC、G-、CMake、Make、QMake-和-CMakeLists-txt/
 - 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!