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

ppcbkaq5  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(306)

对于一个使用MQTT的项目,我总是必须从源代码编译QtMqtt模块,因为它没有包含在预构建的Windows版本中,也不能选择安装。在Qt5中,这非常简单:从官方git(https://code.qt.io/cgit/qt/qtmqtt.git/)下载源代码,在QtCreator中打开.pro文件并编译项目。为了安装,我只是将.dll文件移到了我的Qt安装目录中。
现在在Qt6中,构建过程从qmake切换到了cmake,所以我不能简单地在QtCreator中加载项目,而是必须使用CMake手动编译它,我觉得这非常不直观,而且容易出错。据我所知,从现在开始,我不能自己编译单个模块。但是必须获得完整的Qt6.2.0源代码(即通过安装程序选项),然后在CMake上使用--target选项只构建特定的模块。
1.从安装程序获取Qt源代码(安装到Qt/6.2.0/Src
1.根据this manual创建命令行环境
1.打开cmd环境,导航至构建文件夹(即Qt/6.2.0/build
1.使用以下命令配置生成:..\Src\configure -prefix Qt\6.2.0\build
1.使用命令cmake --build . --target qtmqtt通过cmake进行构建
1.使用命令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编译模块是相当容易的?

cgvd09ve

cgvd09ve1#

据我所知,从现在开始,我不能自己编译单个模块,而是必须获得整个Qt 6.2.0源代码(即通过安装程序选项)
这是不正确的。给定一个预构建的Qt,您应该仍然能够通过运行以下命令从源代码构建qmqtt包:

<QTDIR>\bin\qt-configure-module <mqtt_src_dir>
cmake --build .
oiopk7p5

oiopk7p52#

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

wtzytmuj

wtzytmuj3#

使用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,如下所示:


# include <QtMqtt/QtMqtt>

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

重新生成项目。应干净地编译和链接。

相关问题