Как указать предварительно скомпилированный заголовок для вывода CMake (2.8.12.1) AUTOMOC?
До сих пор в CMakeLists.txt я пробовал эти два по отдельности:
set(AUTOMOC_MOC_OPTIONS "-bstdafx.h")
set(AUTOMOC_MOC_OPTIONS "-fstdafx.h")
Сгенерированный вывод AUTOMOC при сборке проекта (project_automoc.cpp) содержит только файлы moc_xxx.cpp:
/* This file is autogenerated, do not edit*/
/// <- stdafx.h should be here ?!?!
#include "moc_widget_fps.cpp"
#include "moc_widget_sysevents.cpp"
Ответ 1 · рейтинг 2 · sakra
Правильная переменная для установки называется CMAKE_AUTOMOC_MOC_OPTIONS. Он используется для инициализации свойства AUTOMOC_MOC_OPTIONS цели, т.е.:
set (CMAKE_AUTOMOC_MOC_OPTIONS "-bstdafx.h" "-fstdafx.h")
Также обратите внимание, что это только заставит компилятор Qt MOC добавлять данные включения в каждый сгенерированный файл moc_xxx.cpp. Общий project_automoc.cpp не пострадает.
Ответ 2 · рейтинг 2 · Pencheff
Немного покопавшись, я решил просто отключить функцию AUTOMOC для проектов, использующих предварительно скомпилированные заголовки:
set_target_properties (ProjectName PROPERTIES AUTOMOC FALSE)
# Set the headers that need moc'ing
file (GLOB MOC_FILES widget_filetransfer.h widget_main_menu.h widget_main_toolbar.h)
QT5_WRAP_CPP (MOC_SOURCES ${MOC_FILES})
...
# Force PCH for the generated MOC files
foreach (src_file ${MOC_SOURCES})
set_source_files_properties (${src_file}
PROPERTIES COMPILE_FLAGS "/Yustdafx.h /FIstdafx.h"
)
endforeach()
Ответ 4 · Adversus
Возможно, более элегантный способ - отключить предварительно скомпилированные заголовки для файла mocs_.... Это позволяет вам сохранить AUTOMOC:
append_to_source_file_property(
${CMAKE_CURRENT_BINARY_DIR}/<PROJECT_NAME_HERE>_autogen/mocs_compilation.cpp
COMPILE_FLAGS " /Y- ")
В качестве альтернативы, если вы можете/готовы изменить имя и содержимое предварительно скомпилированного заголовочного файла, вы можете добавить к нему это:
#ifdef HACK_FOR_TRICKING_MOC_INTO_INCLUDING_ME_IN_THE_MOCS_FILE_DO_NOT_DEFINE
Q_OBJECT
#endif
Это заставит cmake включить его в файл mocs_.... Затем вам нужно, чтобы он был вверху, что требует изменения имени, файлы сначала сортируются по номерам, затем в верхнем регистре, затем в нижнем регистре, поэтому, например. 1_precompiled.h должно помочь.