2015-09-15 93 views
1

我有test.cpp和test.h文件。 這些文件中我需要有一個條件編譯。如何使條件編譯標誌可用於QT moc文件?

#ifdef CPR 
    int iParameter=1; 
#else 
    int iParameter=2; 
#endif 

從shell腳本當我調用編譯時,基於編譯標誌我導出類似CPR_BUILD。

export CPR_BUILD=y 

在此文件夾

ifeq ($(CPR_BUILD),y) 
    CXXFLAGS+=CPR 
endif 

這適用於.cpp文件中生成文件。 但條件編譯不適用於moc_test.h.cpp文件。

我想我需要在module_name.pro文件中做些什麼來使它可用於moc。但不知道如何。嘗試了下面的東西,但它不起作用。

CPR_BUILD { 
    DEFINES += CPR 
} 

回答

0

已經存在的MOC運行預處理程序符號:

Q_MOC_RUN 

moc

所以你可以做這樣的事情:

#ifdef Q_MOC_RUN 
    #define CPR 
#endif 
+0

這需要在module_name.pro文件中添加? – Pradeep

+0

如何使用CPR_BUILD爲moc定義CPR? – Pradeep

+0

不,這是用於cpp/h文件。如果你之後區分moc'ing和編譯,你可以使用這個符號而不是'CPR',或者不要重寫所有的東西,像我建議的那樣寫ifdef並在某處定義'CPR'(例如在「defines.h」中幷包含它在需要的地方)。 – Gombat

0

我想通了這一點。很抱歉在這裏更新很長時間。

如果使用構建根或其他支持.pro文件的環境,則可以使用.pro文件。在我的情況下,它沒有被使用。

這是一個簡單的基於makefile的編譯,其中使用了Qt。因此,「moc」{Qt的元對象編譯器}就出現了。

正如我在問題中指出的,#ifdef CPR從來沒有工作過。這是moc正在處理頭文件的時候。即使「CFLAGS + = CPR」出現在makefile中,也會出現此錯誤。

解決方案 從Makefile開始,我們調用moc並通過一些重命名來傳遞它的頭文件。像這樣:moc_.cpp 錯誤是在調用moc時,CFLAGS沒有傳遞給它。事實上,將完整的CFLAGS傳遞給moc是不合邏輯的,也是不必要的。因此我必須在調用moc時只傳遞-DCPR。