如何为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"
答案 0 :(得分:2)
要设置的正确变量称为CMAKE_AUTOMOC_MOC_OPTIONS。它用于初始化目标的AUTOMOC_MOC_OPTIONS
属性,即:
set (CMAKE_AUTOMOC_MOC_OPTIONS "-bstdafx.h" "-fstdafx.h")
另请注意,这只会使Qt MOC编译器将给定的包含添加到每个生成的moc_xxx.cpp
文件中。整体project_automoc.cpp
不会受到影响。
答案 1 :(得分:2)
经过一番挖掘后,我决定关闭使用预编译头文件的项目的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()
答案 2 :(得分:0)
AUTOMOC_MOC_OPTIONS不会影响project_automoc.cpp文件。它包含传递给moc以创建“moc_widget_fps.cpp”和“moc_widget_sysevents.cpp”的选项。那些应该包含你的pch包含。
答案 3 :(得分:0)
也许更优雅的方法是禁用document.querySelector
文件的预编译头。这使您可以保留mocs_...
:
AUTOMOC
或者,如果您愿意/愿意更改预编译头文件的名称和内容,则可以将其添加到其中:
append_to_source_file_property(
${CMAKE_CURRENT_BINARY_DIR}/<PROJECT_NAME_HERE>_autogen/mocs_compilation.cpp
COMPILE_FLAGS " /Y- ")
这将欺骗cmake将其包含在#ifdef HACK_FOR_TRICKING_MOC_INTO_INCLUDING_ME_IN_THE_MOCS_FILE_DO_NOT_DEFINE
Q_OBJECT
#endif
文件中。然后,您需要将其放在需要更改名称的顶部,文件首先是按数字编号的顺序,然后是大写字母,然后是小写字母,例如mocs_...
应该可以解决问题。