CMake - структура выходного каталога и модули QML - PullRequest
0 голосов
/ 09 июля 2019

Я пишу плагин / модуль QML для пользовательских элементов управления GUI для большого проекта на работе. Мы используем CMake для построения проекта. Основная структура модуля QML (после компиляции) должна быть такой:

MyModule myplugin.dll control1.qml control2.qml …

Самое важное, что все файлы qml и подключаемый модуль общей библиотеки (в примере myplugin.dll) ДОЛЖНЫ быть размещены в каталоге с EXACTLRY именем модуля (в примере MyModule). В качестве шага после сборки все qml-файлы копируются в этот двоичный каталог вывода.

И вот в чем проблема: скомпилированные бинарные файлы (в примере myplugin.dll) помещаются в каталоги Debug, Release и т. Д. Внутри выходного каталога. Из-за этого результат выглядит так: MyModule/Debug/myplugin.dll - и модуль не работает. Я пытался манипулировать RUNTIME_OUTPUT_DIRECTORY_DEBUG, RUNTIME_OUTPUT_DIRECTORY_RELEASE и всем этим грязным зоопарком, но ... это не вариант, потому что, насколько я знаю, типы build-config могут быть пользовательскими, поэтому я не могу предвидеть все возможные варианты RUNTIME_OUTPUT_DIRECTORY_ и укажите их заранее.

Есть ли какой-нибудь нормальный способ структурировать мой выходной каталог внутри этих Debug, Release, ConfigIDontKnowAboutYet? Например, вместо того, чтобы сделать это следующим образом: MyModule/Debug/myplugin.dll - превратить его в следующее: MyModule/Debug/MyModule/myplugin.dll - потому что последняя часть пути должна быть точно .../MyModule/myplugin.dll, иначе это не сработает. Если такого пути нет, как люди справляются с этим?

Еще одна важная вещь заключается в том, что этот модуль должен использоваться большим проектом к add_subdirectory(). И вот весь этот беспорядок Debug - Release - MyOwnConfig делает все это еще сложнее.

Единственное более или менее найденное решение на данный момент заключалось в install() получении в результате скомпилированных и qml файлов MyModule в двоичном каталоге вывода более крупного проекта, который содержит MyModule в качестве зависимости. Однако есть еще одна проблема. Оказывается, в этом случае мне нужно установить MyModule дважды: один раз в двоичный каталог вывода более крупного проекта, чтобы собрать / протестировать / запустить его, и второй раз, когда я установил сам более крупный проект.

Буду очень признателен за любые предложения. Кроме того, если у кого-то есть довольно большой проект, который использует CMake, C ++ и зависит от модулей QML, я был бы очень признателен, если бы они предоставили ссылку, чтобы взглянуть на него. Спасибо.

1 Ответ

0 голосов
/ 09 июля 2019

CMake предлагает возможность установки файлов после компиляции. Эффект похож на make install команды. С помощью этой команды вы можете установить все или только определенные продукты вашей сборки. Ниже приведен пример того, что я использую в моем CMakeLists.txt.

# The installation is prepended by the CMAKE_INSTALL_PREFIX variable
install(TARGETS ${CMAKE_PROJECT_NAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    PUBLIC_HEADER DESTINATION include
)

Это скопирует ваши продукты, в зависимости от их типов файлов. Но вам все равно нужно установить пути к библиотеке / включить. Для этого я рекомендую скомпилировать несколько целей и использовать место установки первой цели в качестве пути lib / inc (скорее всего, добавить с чем-то вроде include_directories или link_directories).

Для обработки файлов QML, скорее всего, есть способ сделать то же самое с очень похожим синтаксисом. QT предоставляет разработчику выбор между CMake и QMake, поэтому у них, вероятно, есть механизм для этого.

Также имейте в виду, что пути к вашим файлам QML в коде C ++ должны отражать окончательную структуру проекта.

...