无法为模块“QtQuick”(CMake)加载插件

Posted

技术标签:

【中文标题】无法为模块“QtQuick”(CMake)加载插件【英文标题】:plugin cannot be loaded for module "QtQuick" (CMake) 【发布时间】:2020-10-27 15:34:13 【问题描述】:

我已经使用 vcpkg 安装了 Qt,并成功地让 QtWidgets 应用程序正常工作。

我使用 QtCreator 和 QtCreator Qt 二进制文件创建了一个默认的 QtQuick 应用程序,它运行得很好。但是,当转移到 VS Code(其 Qt 二进制文件使用 vcpkg)时,我在控制台中收到以下错误并且应用程序退出:

QQmlApplicationEngine failed to load component
qrc:/main.qml:1:1: plugin cannot be loaded for module "QtQuick": Cannot load library F:\Projects\Dev\Qt-Creator\QtQuickCMakeTest-vscode\build\MSVC-2019-x64\Debug\Debug\qml\QtQuick.2\qtquick2plugind.dll: The specified module could not be found.

但是,当导航到指定位置时,文件“qtquick2plugind.dll”确实存在。查看 VS Code 的调试控制台,我得到以下信息:

Loaded 'F:\Projects\Dev\Qt-Creator\QtQuickCMakeTest-vscode\build\MSVC-2019-x64\Debug\Debug\qml\QtQuick.2\qtquick2plugind.dll'. Symbols loaded.
Unloaded 'F:\Projects\Dev\Qt-Creator\QtQuickCMakeTest-vscode\build\MSVC-2019-x64\Debug\Debug\qml\QtQuick.2\qtquick2plugind.dll'.

为什么要加载和卸载 qtquick2plugind.dll?我假设加载过程失败,但为什么?

这是我的 CMakeLists.txt,尽管它与 Qt Quick 的默认 Qt Creator 完全相同,但我将路径传递给 CMake 最终用于查找 Qt 的 vcpkg 工具链。

cmake_minimum_required(VERSION 3.5)

project(QtQuickCMakeTest LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# QtCreator supports the following variables for android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.

#if(ANDROID)
#    set(ANDROID_PACKAGE_SOURCE_DIR "$CMAKE_CURRENT_SOURCE_DIR/android")
#    if (ANDROID_ABI STREQUAL "armeabi-v7a")
#        set(ANDROID_EXTRA_LIBS
#            $CMAKE_CURRENT_SOURCE_DIR/path/to/libcrypto.so
#            $CMAKE_CURRENT_SOURCE_DIR/path/to/libssl.so)
#    endif()
#endif()

find_package(Qt5 COMPONENTS Core Quick QuickControls2 QuickTemplates2 REQUIRED)

message(STATUS "CURRENT VAR $Qt5_DIR")

if(ANDROID)
    add_library(QtQuickCMakeTest SHARED
      main.cpp
      qml.qrc
    )
else()
    add_executable(QtQuickCMakeTest
      main.cpp
      qml.qrc
    )
endif()

target_compile_definitions(QtQuickCMakeTest
  PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
target_link_libraries(QtQuickCMakeTest
  PRIVATE Qt5::Core Qt5::Quick Qt5::QuickControls2 Qt5::QuickTemplates2)

应用程序正在运行,所以我没有收到链接错误,但 QQmlApplicationEngine::objectCreated 挂钩将我的 QObject 返回为 nullptr,导致 QCoreApplication::exit(-1);被调用。

【问题讨论】:

【参考方案1】:

事实证明,CMake/Qt 没有将所有需要的 DLL 复制到我项目的 bin 文件夹中。

经过大量试验和错误,我发现以下三个 DLL 是必需的,但不存在:

Qt5QmlModelsd.dll Qt5QmlWorkerScriptd.dll Qt5Quickd.dll

奇怪的是其他 DLL(例如 Qt5Qmld.dll)被正确复制,所以现在这个过程的下一步是确定为什么这些特定的 DLL 没有被复制以及如何复制让它按应有的方式自动化,因此仍然非常感谢您提供帮助。

【讨论】:

以上是关于无法为模块“QtQuick”(CMake)加载插件的主要内容,如果未能解决你的问题,请参考以下文章

“无法加载身份验证插件'caching_sha2_password'。找不到特定模块”

QtQuick:未安装模块

一个使用 xmake 构建 c/c++ 模块的 luarocks 插件

如何为插件组件设置 CMAKE 导入目标?

无法加载在 '.eslintrc.json' 中声明的插件 'prettier':找不到模块 'eslint-plugin-prettier'

无法加载插件@typescript-eslint:找不到模块'eslint-plugin-@typescript-eslint'