入门采用 CMake

CMake 是一组允许构建、测试及打包应用程序的工具。就像 Qt,它可用于所有主流开发平台。它还被各种 IDE 所支持,包括 Qt Creator .

在本章节中,将展示在 CMake 工程中使用 Qt 的最基本方法。将逐步介绍范例工程利用 Qt Widgets .

构建 C++ GUI 可执行文件

A CMake 工程由以 CMake 语言编写的文件定义。main 文件称为 CMakeLists.txt ,通常放在实际程序源代码的相同目录下。

这里是典型 CMakeLists.txt 文件,应用程序编写使用 C++ 和 Qt 及 Qt Widgets :

cmake_minimum_required(VERSION 3.16.0)
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.0)
							

cmake_minimum_required() 指定应用程序要求的最低 CMake 版本。Qt 本身至少要求 CMake 第 3.16 版。

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,并导入 Widgets 模块。继续没有意义若 CMake 无法定位模块,因此,设置 REQUIRED 标志以使 CMake 中止 (在这种情况下)。

若成功,模块将设置一些 CMake 文档化变量在 模块变量 。此外,它还导入 Qt6::Widgets 目标 (使用于下文)。

For find_package 要取得成功, CMake 必须找到 Qt 安装。有不同方式可以告诉 CMake 关于 Qt:

  1. 设置 CMAKE_PREFIX_PATH 环境变量以包括 Qt 6 安装前缀。
  2. 设置 CMake 缓存变量 CMAKE_PREFIX_PATH 以包括 Qt 6 安装前缀。

注意, 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 (元对象编译器) .

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 最相关特征的很好介绍。