导入QML DLL时提示‘module "MyQmlDll" is not installed’错误求助
QML DLL模块导入失败问题解决
错误信息
QQmlApplicationEngine failed to load component
qrc:/MainP/main.qml:2:1: module "MyQmlDll" is not installed
以下是针对性的修复步骤:
一、修复DLL项目配置与代码
1. 删除冗余的main.cpp
DLL作为QML插件不需要独立的main函数入口,直接删除该文件。
2. 修正MyLibrary.pro配置
替换为以下内容,确保QML插件的正确生成与资源部署:
CONFIG += dll qmltypes QT += qml quick TARGET = MyQmlDll TEMPLATE = lib # QML模块标识配置 QML_IMPORT_NAME = MyQmlDll QML_IMPORT_MAJOR_VERSION = 1 SOURCES += \ src/myclass.cpp HEADERS += \ src/MyLibrary_global.h \ src/myclass.h # 嵌入QML资源(可选,若需将QML打包进DLL) RESOURCES += qml.qrc # 输出目录设置 DESTDIR = $$PWD/lib # 自动复制qmldir到输出目录 qmldir.files = qmldir qmldir.path = $$DESTDIR INSTALLS += qmldir # 自动复制QML文件到输出目录(与qmldir同路径) qmlfiles.files = src/myqmlobject.qml qmlfiles.path = $$DESTDIR INSTALLS += qmlfiles
3. 修正myclass.h的导出宏
确保类使用DLL导出宏,让外部项目能正确识别:
#ifndef MYCLASS_H #define MYCLASS_H #include <QObject> #include <QQmlEngine> #include "MyLibrary_global.h" class MYLIBRARY_EXPORT MyClass : public QObject { Q_OBJECT QML_ELEMENT public: explicit MyClass(QObject *parent = nullptr) : QObject(parent) {} }; #endif // MYCLASS_H
二、修复主项目配置
1. 修正MainP.pro的库链接配置
原LIBS写法错误,替换为正确的路径与库名格式:
QT += quick # 指定QML模块导入路径 QML_IMPORT_PATH += $$PWD/../MyLibrary/lib # 链接DLL:-L指定库路径,-l指定库名(去掉.dll后缀) LIBS += -L$$PWD/../MyLibrary/lib -lMyQmlDll SOURCES += \ main.cpp resources.files = main.qml resources.prefix = /$${TARGET} RESOURCES += resources
2. 验证主项目的导入路径(可选)
可调整main.cpp中的导入路径为更可靠的写法:
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QCoreApplication> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; // 使用程序目录作为基准,确保路径正确性 engine.addImportPath(QCoreApplication::applicationDirPath() + "/../MyLibrary/lib"); const QUrl url(QStringLiteral("qrc:/MainP/main.qml")); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
三、重新构建项目
- 先清理并构建DLL项目,确保
lib目录下生成MyQmlDll.dll、qmldir、myqmlobject.qml和MyQmlDll.qmltypes文件。 - 再清理并构建主项目,运行即可正常导入
MyQmlDll模块。
内容的提问来源于stack exchange,提问作者Davide Redaelli
相关产品推荐
相关产品推荐

