Qt 在运行时加载自定义QML插件的基于CMake的项目仅在使用MinGW时失败

Qt 在运行时加载自定义QML插件的基于CMake的项目仅在使用MinGW时失败,qt,plugins,cmake,qml,mingw,Qt,Plugins,Cmake,Qml,Mingw,我正试图用CMake和Qt5.15.1来试验一个小项目,其中包括一个在运行时加载的虚拟定制QML插件 项目结构 |-- CMakeLists.txt |-- main.cpp |-- main.qml |-- main.qrc |-- qmlplugins/ |-- customqml/ |-- CMakeLists.txt |-- customqml_plugin.cpp |-- customqml_plugin.h |-

我正试图用CMake和Qt5.15.1来试验一个小项目,其中包括一个在运行时加载的虚拟定制QML插件

项目结构

|-- CMakeLists.txt
|-- main.cpp
|-- main.qml
|-- main.qrc
|-- qmlplugins/
    |-- customqml/
        |-- CMakeLists.txt
        |-- customqml_plugin.cpp
        |-- customqml_plugin.h
        |-- customqml.cpp
        |-- customqml.h
        |-- qmldir
/CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(test_qml_plugin LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED ON)

find_package(Qt5 REQUIRED Gui Core Qml Quick)

add_subdirectory(qmlplugins/customqml)

add_executable(${PROJECT_NAME} main.cpp main.qrc)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Quick Qt5::Gui Qt5::Qml Qt5::Core)
add_dependencies(${PROJECT_NAME} customqml)
set_target_properties(${PROJECT_NAME} PROPERTIES AUTORCC ON)
set(QMLDIR_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/qmldir)
set(QMLDIR_BIN_PATH ${CMAKE_CURRENT_BINARY_DIR}/qmldir)
add_custom_target(customqml-qmldir DEPENDS ${QMLDIR_SRC_PATH} ${QMLDIR_BIN_PATH})
add_custom_command(
  COMMENT "Moving updated resource-file ${QMLDIR_SRC_PATH}"
  OUTPUT ${QMLDIR_BIN_PATH}
  DEPENDS ${QMLDIR_SRC_PATH}
  COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QMLDIR_SRC_PATH} ${QMLDIR_BIN_PATH}
)

add_library(customqml MODULE customqml_plugin.cpp customqml.cpp)
target_link_libraries(customqml PRIVATE Qt5::Qml Qt5::Core)
add_dependencies(customqml customqml-qmldir)
set_target_properties(customqml PROPERTIES AUTOMOC ON)
/main.cpp

#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
QGUI应用程序应用程序(argc、argv);
qqmlaplicationengine;
addImportPath(QCoreApplication::applicationDirPath()+QDir::separator()+“qmlplugins”);
engine.load(QUrl(QStringLiteral(“qrc:/main.qml”));
if(engine.rootObjects().isEmpty())返回-1;
返回app.exec();
}
/main.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.5

import customqml 1.0

ApplicationWindow {
  id: root
  title: qsTr("test_qml_plugin")
  width: 640
  height: 480
  visible: true

  CustomQml {}
}
/main.qrc

<RCC>
  <qresource prefix="/">
    <file>main.qml</file>
  </qresource>
</RCC>
/qmlplugins/customqml/customqml\u plugin.cpp

#包括“customqml_plugin.h”
#包括“customqml.h”
#包括
void CustomqmlPlugin::registerTypes(常量字符*uri){
qmlRegisterType(uri,1,0,“CustomQml”);
}
/qmlplugins/customqml/customqml\u plugin.h

#pragma一次
#包括
类CustomqmlPlugin:publicqqmlextensionplugin{
Q_对象
Q_插件_元数据(IID QQmlExtensionInterface_IID)
公众:
无效注册表类型(常量字符*uri)覆盖;
};
/qmlplugins/customqml/customqml.cpp

#包括“customqml.h”
CustomQml::CustomQml(QObject*父对象):QObject(父对象){}
CustomQml::~CustomQml(){}
/qmlplugins/customqml/customqml.h

#pragma一次
#包括
类CustomQml:publicqobject{
Q_对象
Q_禁用_复制(CustomQml)
公众:
CustomQml(QObject*parent=0);
~CustomQml();
};
/qmlplugins/customqml/qmldir

module customqml
plugin customqml
我用Visual Studio 2019和MinGW 8.0 gcc 10.2.0在Windows上进行了测试,也用gcc 9.3.0在Ubuntu上进行了测试

它使用所有这些配置构建时不会出错

在运行时:

  • 使用VisualStudio和Ubuntu上的gcc,应用程序运行时不会出现任何问题,并显示一个空窗口
  • 但是对于MinGW,它在运行时失败,
    engine.rootObjects()
    是空的,我不明白为什么。我错过了什么

如果您包括qrc文件,则需要添加set(CMAKE_AutoCC ON)

autorc
已为包括qrc文件的目标启用