You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CMake构建Qt6项目时无法导入QML模块,求解决步骤

问题

我的项目结构如下:

-root
--QmlModule
---Component1.qml
---Component2.qml
--App1
---main.cpp
---main.qml
--App2
---main.cpp
---main.qml

我在QmlModule目录下用qt6_add_qml_module创建了静态库类型的QML模块:

qt_add_library(myComponentTarget STATIC)
qt6_add_qml_module(myComponentTarget
URI QmlModule
VERSION 1.0
QML_FILES
    Component1.qml
    Component2.qml
RESOURCES
    logo.png)

接着在App1(以及App2)的CMake配置中,通过target_link_libraries链接该模块,我知道qt6_add_qml_module会自动生成对应插件目标来暴露模块:

add_executable(App1Exe 
    main.cpp)
qt6_add_qml_module(App1Exe
    URI App1
        VERSION 1.0
    QML_FILES
        main.qml)
target_link_libraries(App1Exe 
    PRIVATE 
    myComponentURIplugin)

根目录的CMake配置里,我设置了QML_IMPORT_PATH并添加子目录:

set(QML_IMPORT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/qmlModule)
add_subdirectory(QmlModule)
add_subdirectory(App1)
add_subdirectory(App2)

CMake运行没有错误,但在App1/main.qml中执行import QmlModule时,出现错误:

module "lupinComponentsplugin" is not installed

请问该如何让这个QML模块在应用中正常可见?我遗漏了哪些配置步骤?

解决方案

你当前的配置存在几个关键问题,逐一修复即可解决:

  1. 链接目标名称错误
    qt6_add_qml_module为静态库生成的插件目标名称是URI的驼峰式转换后加plugin,你定义的URI是QmlModule,所以正确的插件目标名应该是QmlModuleplugin,而非myComponentURIplugin。修改App1的target_link_libraries:
target_link_libraries(App1Exe 
    PRIVATE 
    QmlModuleplugin)
  1. QML_IMPORT_PATH配置错误
    静态QML模块的导入路径应该指向构建目录中生成的模块元数据目录,而非源码目录。根目录的CMake需要调整为:
# 设置为构建目录下的QmlModule输出路径,确保CMake能找到模块的qmldir等元文件
set(QML_IMPORT_PATH ${CMAKE_CURRENT_BINARY_DIR}/QmlModule CACHE STRING "Qt QML import paths")
add_subdirectory(QmlModule)
add_subdirectory(App1)
add_subdirectory(App2)

添加CACHE STRING是为了让Qt Creator等IDE能识别到这个导入路径。

  1. 手动注册静态模块插件
    对于静态链接的QML模块,需要在应用的main.cpp中手动注册插件,否则运行时无法找到模块。在App1/main.cpp中添加:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
// 导入自动生成的插件头文件
#include <QmlModuleplugin.h>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    // 注册静态QML模块插件
    QmlModulePlugin::registerTypes("QmlModule");

    const QUrl url(u"qrc:/App1/main.qml"_qs);
    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();
}
  1. 验证模块元数据
    确保QmlModule构建目录下生成了qmldir文件,内容应包含:
module QmlModule
version 1.0
Component1 1.0 Component1.qml
Component2 1.0 Component2.qml
plugin QmlModuleplugin

完成以上修改后,重新运行CMake并构建项目,import QmlModule即可正常工作。

内容的提问来源于stack exchange,提问作者Greg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:20:25