Есть проект среднего размера с верхним уровнем CMakeLists.txt
который определяет некоторые общие вещи и вызывает настройку всех артефактов (подпроектов) в проекте следующим образом:
add_subdirectory(components/A)
add_subdirectory(components/B)
add_subdirectory(components/C)
add_subdirectory(components/E)
Артефакты — это статические / общие библиотеки или исполняемые файлы (которые так или иначе зависят друг от друга). В этом примере есть только один исполняемый файл: E
, Все отлично настраивает и строит, когда старый qt4_wrap_cpp
используется для обработки MOC.
При переходе на (относительно) новый AUTOMOC добавив следующее в начало CMakeLists.txt
:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
все источники статических / общих библиотек AUTOMOC
Эд просто отлично. Тем не менее, источники исполняемой цели (E
в этом примере) никогда AUTOMOC
«Ред.
Я пробовал оба MSYS Makefiles
а также Ninja
генераторы, и оба просто не создают цель для AUTOMOC
‘ing, но только для исходников исполняемого файла (для статических / общих библиотечных целей AUTOMOC
добавлена цель).
Я нашел причину, обсуждение продолжается Список рассылки CMake.
Подводя итог, проблема заключалась в том, что E
не включил модуль Qt ни явно:
find_package(Qt4 ...)
ни косвенно:
find_package(MyPrecious ...)
где MyPrecious
может быть каким-то сторонним модулем, который сам включает Qt.
В результате не кэшированные переменные, такие как QT_VERSION_*
не присутствуют в объеме E
подпроект, и по этой причине AUTOMOC
функция не может функционировать должным образом. Гадкий подводный камень, я бы сказал. Для более подробной информации обратитесь к Список рассылки CMake.
Других решений пока нет …