Qt5,CMake,AUTOMOC和预编译头

时间:2014-01-30 18:32:42

标签: visual-studio-2010 qt cmake qt5 stdafx.h

如何为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"

4 个答案:

答案 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_...应该可以解决问题。