Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Qt5, CMake, AUTOMOC и предварительно скомпилированные заголовки

Автор вопроса: PencheffОтветов: 4

Как указать предварительно скомпилированный заголовок для вывода 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"

visual-studio-2010cmakeqtqt5

Ответы

Ответ 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()

Ответ 3 · steveire

AUTOMOC_MOC_OPTIONS не влияет на файл project_automoc.cpp. Он содержит параметры, переданные moc для создания "moc_widget_fps.cpp" и "moc_widget_sysevents.cpp". Они должны содержать ваш компьютер.

Ответ 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 должно помочь.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы