如何将预编译的标头指定为CMAKE(2.8.12.1)Automoc?
的输出到目前为止,在cmakelists.txt中,我分别尝试了这两个:
set(AUTOMOC_MOC_OPTIONS "-bstdafx.h")
set(AUTOMOC_MOC_OPTIONS "-fstdafx.h")
构建项目时生成的汽车输出(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"
挖掘后,我决定仅关闭使用预编译标头的项目的汽车功能:
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()
要设置的正确变量称为cmake_automoc_moc_options。它用于初始化目标的AUTOMOC_MOC_OPTIONS
属性,即:
set (CMAKE_AUTOMOC_MOC_OPTIONS "-bstdafx.h" "-fstdafx.h")
还要注意,这只会使QT MOC编译器添加给定包含在每个生成的moc_xxx.cpp
文件中。总体project_automoc.cpp
不会受到影响。
automoc_moc_options不会影响project_automoc.cpp文件。它包含传递给MOC的选项,以创建" MOC_WIDGET_FPS.CPP"one_answers" MOC_WIDGET_SYSEVENTS.CPP"。这些应包含您的PCH。
也许更优雅的方法是禁用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
应该做这个问题。