[Qt] 什么是qmake与cmake
一、什么是 CMake
CMake 是一个 跨平台的构建系统(Build System Generator)
它的主要功能是:
根据项目的源代码和配置文件(
CMakeLists.txt
),生成本地构建系统(如 Makefile、Visual Studio 工程、Xcode 工程、Ninja 文件等)
CMake 本身并不直接编译代码,它是 一个自动生成构建规则的工具
比如:
- 在 Linux 上,CMake 可以生成
Makefile
,然后你用make
来真正编译 - 在 Windows 上,它可以生成
.sln
(Visual Studio 解决方案文件),你再用 VS 打开编译 - 在 macOS 上,它可以生成 Xcode 工程文件
举个例子:
mkdir build
cd build
cmake ..
make
这里:
cmake ..
会读取上层目录中的CMakeLists.txt
,生成对应平台的构建文件make
才是真正调用编译器(如g++
)去编译、链接
二、什么是 qmake
qmake 是 Qt 官方自带的构建系统工具,主要用于 Qt 项目
它的作用与 CMake 类似,也能生成 Makefile,然后通过 make 进行编译
但 qmake 专为 Qt 项目设计,它会自动处理:
- Qt 模块(
QT += widgets
) .ui
文件(自动调用uic
).qrc
资源文件.moc
元对象编译(生成信号槽支持)
一个简单的 qmake 项目文件(*.pro
)示例:
QT += widgets
SOURCES += main.cpp mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
然后运行:
qmake
make
qmake 会自动处理 moc/uic/rcc 等 Qt 专有步骤,非常方便
三、CMake 与 qmake 的区别
对比点 | CMake | qmake |
---|---|---|
适用范围 | 通用的跨平台构建系统 | 专门用于 Qt 项目 |
配置文件 | CMakeLists.txt | .pro |
生成目标 | Makefile / VS 工程 / Xcode 等 | Makefile |
扩展性 | 非常强,可与第三方库轻松集成 | 较弱,主要用于 Qt |
生态 | 现代 C++ 项目主流选择(Qt 6 也推荐) | Qt 4/5 时代常用 |
Qt 6 支持 | 官方推荐使用 CMake | 已逐步被淘汰 |
Qt 6 开始,官方已弃用 qmake,推荐完全转向 CMake
四、CMake / qmake 与 “编译” 的区别
这三者的关系可以理解为:
阶段 | 工具 | 作用 |
---|---|---|
1️⃣ 配置阶段 | CMake / qmake | 生成构建规则(Makefile / VS 工程) |
2️⃣ 构建阶段 | make / MSBuild / ninja | 按规则实际调用编译器 |
3️⃣ 编译器阶段 | g++ / clang / cl.exe | 真正把 .cpp 编译为 .o 、链接成 .exe |
- CMake/qmake:告诉系统“项目怎么编译”
- make:执行编译计划
- g++ 等编译器:执行实际编译
五、为什么 Qt Creator 不用你写 .pro
文件也能编译
其实 Qt Creator 在背后 自动帮你生成了 qmake 工程文件
当你在 Qt Creator 里点击「新建项目 → Qt Widgets 应用」时,它会:
-
自动生成
.pro
文件(或.pro.user
) -
自动配置好:
QT += core gui widgets SOURCES += main.cpp mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui
-
自动调用 qmake → make → g++/MinGW/MSVC
所以你没看到 .pro
文件,是因为 Qt Creator 在后台帮你做了
为什么 CMake 必须自己写 CMakeLists.txt
CMake 是一个通用工具,它不知道你的项目属于 Qt,也不知道你要编译哪些源文件
你得用 CMakeLists.txt
明确告诉它
比如:
- 哪些
.cpp
要编译? - 要用哪个 Qt 模块?
- 生成的可执行文件叫什么名字?
- 链接哪些库?
六、一个最小可运行的 Qt CMake 示例
下面是一个最简单的 Qt Widgets 应用的 CMake 配置文件:
在 Qt Creator 里:
- 新建项目 → 选择 “Qt Widgets Application”;
- 在选择构建系统那一步,选 CMake 而不是 qmake;
- Qt Creator 会自动生成类似上面的
CMakeLists.txt
,并帮你配置好 Qt 模块
文件结构
MyQtApp/
├── CMakeLists.txt
├── main.cpp
└── mainwindow.ui
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(MyQtApp VERSION 1.0 LANGUAGES CXX)# 告诉 CMake 我们要用 Qt6
find_package(Qt6 REQUIRED COMPONENTS Widgets)# 启用 Qt 自动处理 .ui / .qrc / .moc
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)# 设置源文件
set(SOURCESmain.cpp
)# 生成可执行文件
add_executable(MyQtApp ${SOURCES})# 链接 Qt 库
target_link_libraries(MyQtApp PRIVATE Qt6::Widgets)
解释一下
行号 | 说明 |
---|---|
1 | 声明 CMake 最低版本 |
2 | 定义项目名和语言 |
5 | 告诉 CMake:我需要 Qt6 的 Widgets 模块 |
8-10 | 启用自动生成 moc/uic/rcc 文件(Qt 信号槽、UI、资源) |
13 | 告诉 CMake 要编译哪些源文件 |
16 | 定义生成一个可执行文件 |
19 | 链接 Qt 库 |
编译方式(命令行)
mkdir build
cd build
cmake ..
cmake --build .
这样就能生成可执行文件 MyQtApp
(Windows 下为 .exe
)