在 Qt6 中构建特定模块(即 QtMqtt)

Build specific modules in Qt6 (i.e. QtMqtt)

对于使用 MQTT 的项目,我总是不得不从源代码编译 QtMqtt 模块,因为它没有包含在预构建的 windows 版本中,也无法选择安装。在 Qt5 中,这非常简单:从官方 git (https://code.qt.io/cgit/qt/qtmqtt.git/) 下载源代码,在 QtCreator 中打开 .pro 文件并编译项目。对于安装,我只是将 .dll 文件移动到我的 Qt 安装目录。

现在在Qt6中,构建过程从qmake切换到cmake,所以我不能简单地在QtCreator中加载项目,而是必须使用CMake手动编译它,我发现这非常不直观并且容易出错。据我所知,从现在开始我不能自己编译单个模块,而是必须获取整个 Qt 6.2.0 源代码(即通过安装程序选项),然后在 CMake 上使用 --target 选项来构建只有特定的模块。所以这是我到目前为止所做的:

  1. 从安装程序获取 Qt 源代码(安装到 Qt/6.2.0/Src
  2. 根据this manual
  3. 创建命令行环境
  4. 打开 cmd 环境,导航到构建文件夹(即 Qt/6.2.0/build
  5. 使用命令配置构建:..\Src\configure -prefix Qt.2.0\build
  6. 使用 cmake 命令构建 cmake --build . --target qtmqtt
  7. 使用命令安装cmake --install .

会发生什么情况,配置有效,构建也应该有效,但安装失败,如:

CMake Error at qtbase/src/3rdparty/libpng/cmake_install.cmake:41 (file):
  file INSTALL cannot find
  "F:/DEV/prog/Qt/6.2.0/build/qtbase/mkspecs/modules/qt_ext_libpng.pri": File
  exists.
Call Stack (most recent call first):
  qtbase/src/3rdparty/cmake_install.cmake:42 (include)
  qtbase/src/cmake_install.cmake:42 (include)
  qtbase/cmake_install.cmake:244 (include)
  cmake_install.cmake:42 (include)

文件夹 Qt/6.2.0/build 只包含 .cmake 文件,但没有任何对我来说似乎可用的 .dll 文件。我只是不明白如何使用 cmake 正确设置所有内容。为什么他们现在要把它弄得这么复杂,因为在 Qt5 中使用 qmake 编译模块相当容易?

尝试将 cmake --install . 替换为 cmake --install qtmqtt

From what I understand, I cannot compile single modules on their own from now on, but have to get the whole Qt 6.2.0 source code instead (i.e. via installer option)

这是不正确的。给定一个预构建的 Qt,您应该仍然能够通过 运行 例如

从源代码构建 qmqtt 包
<QTDIR>\bin\qt-configure-module <mqtt_src_dir>
cmake --build .

使用 Qt 安装程序在 ${HOME}/Qt/6.3.0/ 中安装了 Qt 6.3.0,我就是这样做的

详细步骤:

# Create a work directory
mkdir ~/temporal && cd ~/temporal

# Clone the repository
git clone https://github.com/qt/qtmqtt.git

# Switch to the repository
cd qtmqtt

# Checkout the branch corresponding to the target kit
git checkout 6.3.0

# Create a directory to build the module cleanly
mkdir build && cd build

# Use the qt-configure-module tool 
~/Qt/6.3.0/gcc_64/bin/qt-configure-module ..

# Build it here
~/Qt/Tools/CMake/bin/cmake --build .

# Install the module in the correct location 
~/Qt/Tools/CMake/bin/cmake --install . --verbose

在干净的项目上测试:

编辑项目的 CMakeLists.txt 文件

  1. Mqtt 添加到相关的 find_package 宏中,如下所示:

    find_package(QT 名称 Qt6 组件小部件网络 Sql 需要 Mqtt)

  2. Qt${QT_VERSION_MAJOR}::Mqtt 添加到 target_link_libraries 行,如下所示:

    target_link_libraries(MyCleanProject PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::Mqtt Qt ${QT_VERSION_MAJOR}::Sql)

  3. 运行CMake

尝试实际使用模块

  1. 像这样在项目源中添加相关的包含:

    #include

    // 并尝试实际使用 QtMqtt 类

    QMqttClient客户端;

  2. 重建项目。应该干净地编译和link。