2014-01-30 105 views
6

如何指定一个预编译的头向CMake(2.8.12.1)AUTOMOC的输出?QT5,CMake的,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

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

+1

我在我的项目看,当我打开AUTOMOC ON,对于每个file.h该有一个带有Q_OBJECT的类,我在构建目录中获得了一个相应的moc_file.cpp。这些文件不会添加到我的(Visual Studio)项目中,而是我得到一个包含所有moc'ed cpp文件的project_automoc.cpp文件。由于我的项目使用预编译头文件,因此该文件应包含stdafx.h。如果我手动将/FIstdafx.h添加到VS中的该文件,它编译得很好 – Pencheff

+0

验证moc命令行在创建moc_file.cpp时是否包含适当的-b和-f选项。 – steveire

+0

@steveire如何从cmake影响moc命令行? –

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不会受到影响。

+0

但我需要影响'project_automoc.cpp' :(。因为项目数不编译该文件不预编译头。 –

+0

这可能吗? –

+1

望着CMake的源代码,它似乎是'project_automoc.cpp'的产生硬编码,是不可配置。 – sakra

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() 
+0

当转动automoc关闭,请注意,在Windows中可以很容易地通过执行从命令行的源代码文件夹'FINDSTR/M/S“Q_OBJECT”“的* .h”'获得与Q_OBJECT宏的所有头文件的列表。对于Linux/MacOS,肯定有类似的命令 –

+0

在此期间还有其他解决方案吗?理想情况下,cmake会提供一个选项来将包含文件添加到生成的_automoc文件中,对吗? – codeling