在 Qt6 中构建特定模块(即 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.打开cmd环境,导航到build文件夹(即 Qt/6.2.0/build

  1. 使用命令配置构建: ..Srcconfigure -prefix Qt6.2.0build
  2. 使用命令 cmake --build . --target qtmqtt 使用 cmake 构建
  3. 使用命令 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 编译模块相当容易,为什么他们现在要把它弄得这么复杂呢?

stack overflow Build specific modules in Qt6 (i.e. QtMqtt)
原文答案
author avatar

接受的答案

据我了解,从现在开始我不能自己编译单个模块,而是必须获取整个 Qt 6.2.0 源代码(即通过安装程序选项)

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

<QTDIR>binqt-configure-module <mqtt_src_dir>
cmake --build .

答案:

作者头像

使用 Qt 安装程序在 ${HOME}/Qt/6.4.0/ 中安装 Qt 6.4.0,这就是我在 Linux 上的做法。

详细步骤:

# 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.4.0

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

# Use the qt-configure-module tool 
~/Qt/6.4.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 NAMES Qt6 COMPONENTS Widgets Network Sql Mqtt REQUIRED)

(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

尝试实际使用该模块

在项目源中添加相关包含,如下所示:

#include <QtMqtt/QtMqtt>

// and then try to use QtMqtt classes
QMqttClient client;

重建项目。应该干净地编译和链接。

作者头像

尝试用 cmake --install . 替换 cmake --install qtmqtt