7

如何为 CMake (2.8.12.1) AUTOMOC 的输出指定预编译头文件?

到目前为止,在 CMakeLists.txt 我已经分别尝试了这两个:

 set(AUTOMOC_MOC_OPTIONS "-bstdafx.h")
 set(AUTOMOC_MOC_OPTIONS "-fstdafx.h")

构建项目 (project_automoc.cpp) 时生成的 AUTOMOC 输出仅包含 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"
4

4 回答 4

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()
于 2014-03-22T09:44:36.383 回答
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不会受到影响。

于 2014-03-19T16:52:31.663 回答
0

AUTOMOC_MOC_OPTIONS 不影响 project_automoc.cpp 文件。它包含传递给 moc 以创建“moc_widget_fps.cpp”和“moc_widget_sysevents.cpp”的选项。那些应该包含你的 pch 包括。

于 2014-01-31T17:36:17.227 回答
0

一种可能更优雅的方法是禁用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应该可以解决问题。

于 2020-02-19T19:05:29.483 回答