2014-01-30 100 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