无法为模块“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'。找不到特定模块”
一个使用 xmake 构建 c/c++ 模块的 luarocks 插件
无法加载在 '.eslintrc.json' 中声明的插件 'prettier':找不到模块 'eslint-plugin-prettier'
无法加载插件@typescript-eslint:找不到模块'eslint-plugin-@typescript-eslint'