CMake
是一组允许构建、测试及打包应用程序的工具。就像 Qt,它可用于所有主流开发平台。它还被各种 IDE 所支持,包括
Qt Creator
.
本节将展示在 CMake 工程中使用 Qt 的最基本方式。将逐步介绍范例工程利用 Qt Widgets .
CMake
工程是以 CMake 语言编写的文件定义。main 文件称为
CMakeLists.txt
,通常放在实际程序源代码的相同目录下。
这里是典型
CMakeLists.txt
文件,应用程序编写使用 C++ 和 Qt 及
Qt Widgets
:
cmake_minimum_required(VERSION 3.16) project(helloworld VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt6 COMPONENTS Widgets REQUIRED) add_executable(helloworld mainwindow.ui mainwindow.cpp main.cpp resources.qrc ) target_link_libraries(helloworld PRIVATE Qt6::Widgets)
让我们浏览一下内容。
cmake_minimum_required(VERSION 3.16)
cmake_minimum_required()
specifies the minimum CMake version that the application requires. Qt itself requires at least CMake version 3.16. If you use a Qt that was built statically - the default in
Qt for iOS
and
Qt for WebAssembly
- 需要 CMake 3.21.1 或更高版本。
project(helloworld VERSION 1.0.0 LANGUAGES CXX)
project()
设置工程名称和默认工程版本。
LANGUAGES
自变量告诉 CMake 程序是以 C++ 编写的。
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)
Qt 6 要求编译器支持 C++ 第 2017 或更高版本。实施这是通过设置
CMAKE_CXX_STANDARD
,
CMAKE_CXX_STANDARD_REQUIRED
变量将使 CMake 打印错误,若编译器太旧。
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON)
Qt 应用程序通常使用
MOC (元对象编译器)
,
RCC (资源编译器)
,和
uic (用户界面编译器)
由 Qt 附带。设置
CMAKE_AUTOMOC
,
CMAKE_AUTORCC
,和
CMAKE_AUTOUIC
变量到
ON
将允许 CMake 自动设置规则,以便透明地调用各个编译器 (当要求时)。
find_package(Qt6 COMPONENTS Widgets REQUIRED)
这告诉 CMake 去查找 Qt 6,并导入
小部件
模块。继续没有意义若
CMake
无法定位模块,因此,设置
REQUIRED
标志以使 CMake 中止 (在这种情况下)。
若成功,模块将设置一些 CMake 文档化变量在
模块变量
。此外,它还导入
Qt6::Widgets
目标 (使用于下文)。
For
find_package
要取得成功,
CMake
必须找到 Qt 安装。有不同方式可以告诉
CMake
about Qt, but the most common and recommended approach is to set the CMake cache variable
CMAKE_PREFIX_PATH
to include the Qt 6 installation prefix. Note that
Qt Creator
会透明地处理这种情况。
add_executable(helloworld mainwindow.ui mainwindow.cpp main.cpp resources.qrc )
add_executable()
告诉 CMake 想要构建的可执行文件 (因此不是库) 称为
helloworld
作为目标。应该构建目标从 C++ 代码 (
mainwindow.cpp
,
main.cpp
),
Qt Designer
文件 (
mainwindow.ui
),和
Qt 资源系统
文件 (
resources.qrc
).
注意,通常不会在此列出头文件。这异于 qmake ,需要明确列出头文件,以便处理它们通过 MOC (元对象编译器) .
For less trivial projects, you may want to call
qt_add_executable()
instead. It is a wrapper around the built-in
add_executable()
command, providing additional logic to automatically handle things like linking of Qt plugins in static Qt builds, platform-specific customization of library names and so on.
target_link_libraries(helloworld PRIVATE Qt6::Widgets)
最后,
target_link_libraries
告诉 CMake
helloworld
可执行文件利用
Qt Widgets
通过引用
Qt6::Widgets
目标,导入通过
find_package()
调用 (见上文)。这不仅将正确自变量添加到链接器,且还确保将正确包括目录、编译器定义传递给 C++ 编译器。
PRIVATE
关键字对于可执行目标不是严格必要的,但指定它是良好实践。若
helloworld
是库而不是可执行文件,那么
PRIVATE
or
PUBLIC
应该指定 (
PUBLIC
若库提到的任何东西来自
Qt6::Widgets
在其头中,
PRIVATE
否则)。
官方 CMake 文档编制 是使用 CMake 的宝贵资源。
书籍 专业 CMake:实践指南 提供 CMake 最相关特征的很好介绍。