问题描述
我已经使用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以及如何使其达到应有的自动化程度,因此仍将不胜感激。