【问题标题】:Building Qt Qml Plugin using CMake使用 CMake 构建 Qt Qml 插件
【发布时间】:2018-06-25 11:43:13
【问题描述】:

我想使用CMake(而不是QMake)编译Qt Qml Plugin,并将这个插件添加到某个应用程序中。插件和应用脚本应该在单独的CMakeLists.txt

文件结构:

CMakeLists.txt
main.cpp
main.qml
qml.qrc
plugin/
    CMakeLists.txt
    MyItem.cpp
    MyItem.h
    Plugin.h
    qmldir

我有一个脚本plugin/CMakeLists.txt 生成libmyplugin.dylibqmldir 并将其放到插件二进制目录的plugin/MyPlugin 子文件夹中:

plugin/CMakeLists.txt:

cmake_minimum_required(VERSION 3.8)

add_library(myplugin SHARED
    Item.cpp
    Item.h
    Plugin.h
)

set_target_properties(myplugin PROPERTIES
    AUTOMOC TRUE
    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/package/MyPlugin
)

# Copy qmldir file
add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/package/MyPlugin/qmldir
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/qmldir
    COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" "${CMAKE_CURRENT_BINARY_DIR}/package/MyPlugin/qmldir"
    COMMENT "Copy qmldir"
)
target_sources(myplugin PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}/package/MyPlugin/qmldir
)

find_package(Qt5 REQUIRED COMPONENTS Core Qml Quick)
target_link_libraries(viewWorld PUBLIC Qt5::Core Qt5::Qml Qt5::Quick)

现在我需要在app 目标之前/之后构建myplugin 目标并将插件文件从<myplugin binary dir>/plugin 复制到app 目标二进制文件的位置(在Windows 和Linux 的情况下)或<app bundle>/Contents/PlugIns(在macOS 的情况):

CMakeLists.txt:

cmake_minimum_required(VERSION 3.8)

add_executable(app
    main.cpp
    qml.qrc
)

set_target_properties(app PROPERTIES
    AUTORCC TRUE
)

add_subdirectory(plugin)
add_dependencies(app plugin)
# Needs to copy plugin files...

find_package(Qt5 REQUIRED COMPONENTS Core Qml Quick)
target_link_libraries(viewWorld PUBLIC Qt5::Core Qt5::Qml Qt5::Quick)

仅当插件文件发生更改时,我才需要复制它们。编写将采用app 目标和plugin 目标并创建适当依赖关系的函数会很棒。

【问题讨论】:

    标签: qt cmake qml qtquick2 qt-quick


    【解决方案1】:

    对于我的 Qt 项目和 qml 插件,我使用下一个规则。实际是win平台的,希望对你的macOS有帮助

    所有项目的输出目录都相同:

    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
    

    因此,所有带有 CMakeLists 的子目录及其项目目标都将构建到同一目录中。有助于项目运行和最终部署。

    我复制到目录的Qml插件

    set_target_properties(targetProject PROPERTIES
       RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/plugins/${QmlPluginName}/)
    

    构建 qml 插件后,我将 qmldir 文件复制到 RUNTIME_OUTPUT_DIRECTORY

    add_custom_command(TARGET ${targetProject} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
        ${QML_DIR_FILE}
        ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/plugins/${QmlPluginName}/qmldir)
    

    在这些步骤之后,我有了 hext 目录结构:

    /build_dir/bin/Debug/
               |application.exe
               |plugins/
               | |QmlPluginName/
               | | |qmldir
               | | |QmlPluginName.dll
    

    所以在这一步之后不要忘记:

    QQmlApplicationEngine engine;
    engine.addImportPath("./plugins");    
    

    附:对不起我的英语

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2020-03-14
      • 2011-06-12
      • 2020-12-23
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多