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

问题描述

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

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

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完全相同,但我将路径传递给了我的vcpkg工具链,CMake最终将其用于查找Qt。

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 @R_122_4045@ion.
# 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);。被称为。

解决方法

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

经过一堆反复的试验,我发现以下三个DLL是必需的,但不存在:

  • Qt5QmlModelsd.dll
  • Qt5QmlWorkerScriptd.dll
  • Qt5Quickd.dll

奇怪的是,正确复制了其他DLL(例如Qt5Qmld.dll),因此,此过程的下一步是确定为什么不复制这些特定的DLL以及如何使其达到应有的自动化程度,因此仍将不胜感激。