Сборка Qt Qml Plugin с использованием CMake - PullRequest
0 голосов
/ 25 июня 2018

Я хочу скомпилировать Qt Qml Plugin , используя CMake (вместо QMake), и добавить этот плагин в какое-то приложение.Плагин и скрипт приложения должны быть в отдельном CMakeLists.txt.

Структура файла:

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

У меня есть скрипт plugin/CMakeLists.txt, который генерирует libmyplugin.dylib и qmldir и помещает его в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)

Теперь мне нужно построить цель myplugin до / после app target и скопировать файлы плагина из<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 target и plugin target и создавать соответствующие зависимости.

1 Ответ

0 голосов

Для моих проектов 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");    

P.S. извините за мой английский

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...