LINUX.ORG.RU

Cmake и AUTOMOC

 ,


0

1

Доброго времени суток,

Ест cmake-проект, где библиотеки слинкованы примерно так

rootDir/CmakeLists.txt:
set(CMAKE_AUTOMOC ON)

subdir1/CmakeLists.txt:
target_link_libraries(myLibrary PUBLIC Qt5::Core)

subdir2/CmakeLists.txt:
target_link_libraries(myModule PRIVATE myLibrary)

subdir3/CmakeLists.txt:
target_link_libraries(myApp PRIVATE myModule)

По идее myModule должен знать о Qt, но Automoc для myModule не вызывается пока в subdir2 не поместить find_package(Qt5 COMPONENTS Core REQUIRED)

В чем подвох? Как правильно организовать зависимости? Пока что я поместил find_package в корневой Cmake перед add_subdir, но возможно есть какой-то более правильный вариант?


По идее myModule должен знать о Qt

С чего бы? Именно

find_package(Qt5 COMPONENTS Core REQUIRED)
загружает необходимые механизмы для работы с moc-ом, и только после него всё начинает работать. Я бы вообще find_package продублировал в каждом CMakeLists.txt, где есть необходимость moc использовать, включая корневой

XMs ★★★★★
()
Ответ на: комментарий от XMs

С одной стороны да, так правильно получается, с другой в каждом модуле по лишней строчке, а их много (штук 60). Это приложение с игрушками/подприложениями, каждая игрушка в своем модуле в виде статической библиотеки, которая зависит только от библиотеки myLibrary, и в конце все либы собираются в одно финальное приложение. Идея в том, чтобы девелоперы игрушек не лезли в соседние, слой инкапсуляции такой. Может тогда в myLibrary создать какой SetupModule.cmake и инклудить его везде?

set(CMAKE_AUTOMOC ON) тоже везде прописывать?

ncuxer
() автор топика
Ответ на: комментарий от ncuxer

Если они даже теоретически не будут собираться с проектом, в котором Qt используется не везде, тогда можно не дублировать, разумеется. Тут, скорее, страховка на случай, если подпроект будет включаться корневым CMakeLists, не имеющим указанной инструкции. С set (CMAKE_AUTOMOC ON) ситуация та же

XMs ★★★★★
()

По идее myModule должен знать о Qt, но Automoc для myModule не вызывается пока в subdir2 не поместить find_package(Qt5 COMPONENTS Core REQUIRED)

myModule будет знать (если все правильно настроено) о расположении заголовочных/бинарных файлах myLibrary. То, от чего зависит myLibrary, безразлично для myModule. При этом, если у тебя есть нужда вызова MOC для myModule, значит myModule напрямую зависит от Qt и должен подключать ее самостоятельно. Тот факт, что myLibrary зависит от Qt неверно использовать при написании описания сборки для myModule, ибо ты нарушаешь принцип инкапсуляции.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от XMs

Ну да, тогда лучше глобально включить, нигде это использоваться не будет отдельно, проект закрытый, только myLibrary открыта, но там и так все хорошо прописано.

ncuxer
() автор топика
Ответ на: комментарий от ncuxer

Это приложение с игрушками/подприложениями, каждая игрушка в своем модуле в виде статической библиотеки

Что за игрушки? Геймблинг? Мобильные игры под QML?

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

Под лазерный проектор, простенькие, тетрисы и прочее

ncuxer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.