使用 Qt Creator 创建 Qt 项目时,通常会自动生成一个 CMakeLists.txt 文件。它是 CMake 项目的配置文件,用于描述项目的基本信息、依赖库、源文件以及构建和安装方式。
下面对这份 CMakeLists.txt 进行逐行分析。
1. 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.19)
cmake_minimum_required() 用于指定项目所要求的最低 CMake 版本。
这里的:
VERSION 3.19
表示该项目要求 CMake 版本不低于 3.19。
如果当前系统中的 CMake 版本低于这个要求,CMake 在配置项目时会给出相应提示或错误。
2. 定义项目
project(RadarSimulation LANGUAGES CXX)
project() 用于定义一个 CMake 项目。
其中:
RadarSimulation
表示项目名称。
LANGUAGES CXX
表示该项目使用 C++。
CMake 中常见的语言标识包括:
C C语言
CXX C++
ASM 汇编
因此:
project(RadarSimulation LANGUAGES CXX)
可以理解为:
创建一个名为 RadarSimulation、使用 C++ 语言的 CMake 项目。
3. 查找 Qt6
find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets)
find_package() 用于查找项目所依赖的软件包或库。
这里表示查找 Qt6。
其中:
Qt6
表示需要 Qt6。
6.5
表示要求 Qt 版本至少为 6.5。
REQUIRED
表示 Qt 是项目运行所必需的依赖。如果找不到满足要求的 Qt,CMake 配置过程将无法正常继续。
COMPONENTS Core Widgets
表示除了 Qt6 本身之外,还需要 Qt6 的两个组件:
- Core
- Widgets
所以这一整行可以理解为:
查找版本不低于 6.5 的 Qt6,并且要求其中的 Core 和 Widgets 模块可用。
4. Qt 标准项目配置
qt_standard_project_setup()
这是 Qt 提供的 CMake 函数,用于对 Qt 项目进行标准化配置。
它可以帮助项目设置 Qt 推荐的构建方式,并处理一些 Qt 项目常见的自动化配置。
使用 Qt6 和 CMake 创建项目时,这通常是 Qt Creator 自动生成的标准配置。
一般情况下不需要修改这一行。
5. 创建可执行程序
qt_add_executable(RadarSimulation
WIN32 MACOSX_BUNDLE
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
qt_add_executable() 用于创建一个可执行程序目标。
这里:
RadarSimulation
是生成的可执行程序目标名称。
后面的文件:
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
表示这些文件属于这个可执行程序。
也就是说,CMake 会根据这些源文件和配置,最终构建出一个名为 RadarSimulation 的可执行程序。
6. WIN32
WIN32
WIN32 是 CMake 提供的一个选项。
在 Windows 平台上,它表示将该目标作为 Windows GUI 应用程序处理,而不是控制台程序。
例如普通的 Windows 图形界面程序通常不希望启动时出现一个额外的控制台窗口,这个选项就是相关配置之一。
需要注意的是:
WIN32 并不表示这个程序只能在 Windows 上运行。
它只是针对 Windows 平台生效。
7. MACOSX_BUNDLE
MACOSX_BUNDLE
这个选项用于 macOS 平台。
它表示将生成的 macOS 应用程序作为 Bundle 进行处理。
macOS 中常见的:
xxx.app
就是一种应用程序 Bundle。
因此:
WIN32 MACOSX_BUNDLE
主要是在告诉 CMake:
Windows 和 macOS 平台下,都按照相应的图形界面应用程序形式处理这个可执行程序。
8. 源文件
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
这些是 Qt Creator 创建项目时常见的几个文件。
其中:
main.cpp
通常是 C++ 程序入口。
mainwindow.cpp
通常存放窗口类的实现代码。
mainwindow.h
通常存放窗口类的声明。
mainwindow.ui
是 Qt Designer 使用的 UI 文件,用于描述图形界面的布局和控件。
CMake 将这些文件作为可执行程序目标的一部分进行构建。
9. 链接库
target_link_libraries(RadarSimulation
PRIVATE
Qt::Core
Qt::Widgets
)
target_link_libraries() 用于指定目标程序需要链接的库。
这里的目标是:
RadarSimulation
需要使用:
Qt::Core
Qt::Widgets
两个 Qt 模块。
也就是说:
RadarSimulation
│
├── Qt::Core
│
└── Qt::Widgets
这样在程序中使用 Qt 提供的相关类和功能时,链接器才能正确完成最终的程序构建。
10. PRIVATE 是什么意思?
这里有:
PRIVATE
CMake 中的库依赖通常可以使用:
PRIVATE
PUBLIC
INTERFACE
进行描述。
简单理解:
PRIVATE
表示这个依赖只属于当前目标内部使用。
PUBLIC
表示当前目标需要使用,同时依赖当前目标的其他目标也需要这个依赖。
INTERFACE
表示当前目标本身不需要,但依赖当前目标的其他目标需要。
对于一个普通的 Qt 应用程序:
target_link_libraries(RadarSimulation
PRIVATE
Qt::Core
Qt::Widgets
)
使用 PRIVATE 是非常常见的写法。
11. install() 安装配置
install(TARGETS RadarSimulation
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install() 用于指定项目执行安装操作时,各类文件应该被安装到什么位置。
这里:
TARGETS RadarSimulation
表示对 RadarSimulation 这个目标进行安装配置。
12. DESTINATION
例如:
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
表示运行时文件应该安装到指定的 bin 目录。
而:
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
表示库文件安装到指定的 lib 目录。
BUNDLE DESTINATION .
则主要针对 macOS Bundle。
这里使用的:
${CMAKE_INSTALL_BINDIR}
${CMAKE_INSTALL_LIBDIR}
是 CMake 中的变量,用于表示相应的安装目录。
13. 生成 Qt 部署脚本
qt_generate_deploy_app_script(
TARGET RadarSimulation
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
这是 Qt6 提供的部署相关功能。
它用于生成一个应用程序部署脚本。
其中:
TARGET RadarSimulation
表示针对 RadarSimulation 这个目标生成部署配置。
OUTPUT_SCRIPT deploy_script
表示生成的部署脚本名称保存到:
deploy_script
这个 CMake 变量中。
NO_UNSUPPORTED_PLATFORM_ERROR
表示在某些不支持该部署方式的平台上,不直接因为该原因产生错误。
14. 执行部署脚本
最后:
install(SCRIPT ${deploy_script})
表示在安装阶段执行前面生成的部署脚本。
前面的代码:
qt_generate_deploy_app_script(
TARGET RadarSimulation
OUTPUT_SCRIPT deploy_script
)
负责生成脚本。
这里:
install(SCRIPT ${deploy_script})
负责在安装过程中执行这个脚本。
两者结合起来,就形成了:
生成部署脚本
↓
保存到 deploy_script
↓
install()
↓
安装时执行部署脚本
15. 整个 CMakeLists.txt 的结构
1. 指定 CMake 最低版本
2. 定义项目
3. 查找 Qt6
4. Qt 标准项目配置
5. 创建可执行程序
6. WIN32
7. MACOSX_BUNDLE
8. 源文件
9. 链接库
10. PRIVATE 是什么意思?
11. install() 安装配置
12. DESTINATION
13. 生成 Qt 部署脚本
14. 执行部署脚本
把整个文件串起来,可以得到一个比较清晰的结构:
CMakeLists.txt
│
├── cmake_minimum_required()
│ ↓
│ 指定最低 CMake 版本
│
├── project()
│ ↓
│ 定义项目名称和语言
│
├── find_package()
│ ↓
│ 查找 Qt 依赖
│
├── qt_standard_project_setup()
│ ↓
│ 设置 Qt 项目的标准配置
│
├── qt_add_executable()
│ ↓
│ 创建可执行程序并指定源文件
│
├── target_link_libraries()
│ ↓
│ 链接所需要的 Qt 库
│
├── install()
│ ↓
│ 设置安装规则
│
├── qt_generate_deploy_app_script()
│ ↓
│ 生成 Qt 部署脚本
│
└── install(SCRIPT …)
↓
执行部署脚本
因此,这份 CMakeLists.txt 本质上是在回答几个问题:
这个项目叫什么?
project(…)
需要什么环境和依赖?
find_package(…)
需要编译哪些文件?
qt_add_executable(…)
需要链接哪些库?
target_link_libraries(…)
安装和部署时应该怎么处理?
install(…)
qt_generate_deploy_app_script(…)
对于刚接触 Qt 和 CMake 的开发者来说,首先理解这几个核心部分,就已经能够读懂大多数 Qt Creator 自动生成的基础 CMakeLists.txt。





