Qt5 и CMake: добавить заголовки для AUTOMOC

#qt #cmake #automocking

#qt #cmake #автоматическая блокировка

Вопрос:

Qt с CMake часто приводит к проблемам при компоновке.

После прочтения нескольких сообщений и попыток я обнаружил, что AUTOMOC принимает исходные файлы, указанные с add_executable помощью, но игнорирует мои заголовочные файлы внутри включаемой папки, указанной с include_directories( inc ) помощью . После добавления заголовка, отправленного в add_executable сборку, сборка прошла успешно.

Но каков правильный способ сообщить AUTOMOC файлы заголовков?

В моем CMake CMakeLists.txt Я использую

 set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
include_directories( inc )

set(QT5_MODULES Widgets)
find_package(Qt5 REQUIRED COMPONENTS ${QT5_MODULES})

add_definitions( -DQT_NO_KEYWORDS
                 -DQT_CORE_LIB 
                 -DQT_GUI_LIB 
                 -DQT_WIDGETS_LIB
                 -DQT_NO_DEBUG 
                 -DROSCONSOLE_BACKEND_LOG4CXX
                 -fPIC)

add_executable( MyGui
                src/main.cpp 
                inc/gui.h src/gui.cpp )

ament_target_dependencies( MyGui )
qt5_use_modules(MyGui ${QT5_MODULES})
  

Комментарии:

1. если вы поместите заголовок в каталог src не как add_executable исходный файл, это сработает?

2. Это также может быть изменено в более новой версии cmake. В документации Cmake 3 указано, что заголовочные файлы с тем же базовым именем автоматически анализируются для QOBJECT Makro. Какую версию cmake вы используете?

3. Я запускаю CMake 3.5

4. И работает ли это, если у вас есть заголовок в каталоге src? Тогда похоже на ошибку или что cmake действительно не анализирует включаемые каталоги.

5. @Hayt Да. Я переместил файл .h в папку *src/ — и удалил запись on add_executable . Тогда это сработает. Но это разрушает идею разделения заголовков и источников.