2010-11-22 51 views
4

我的Qt項目鏈接到僅限linux的庫。當項目在linux下運行時,我希望使用該庫中定義的類型在事件上觸發信號。然而,我所遇到的一個複雜情況是,該項目也必須在Windows中構建。顯然,這個信號和插槽捕捉它不會在Windows中存在,這很好。但是,我發現Qt的moc工具無法識別發出信號的代碼周圍是否存在#ifdef __linux__。我的代碼如下所示:封裝在ifdef中的Qt信號

[SomeFile.h]

#ifdef __linux__ 
signals: 
    void SomeSignal(SomeTypeDefinedInTheLinuxLibrary); 
#endif 

[SomeFile.cpp]

#ifdef __linux__ 
    emit SomeSignal(someObject); 
#endif 

當我試圖相剋編譯此++,我得到的錯誤: SomeFile.cpp:(.text+0x858c): undefined reference to SomeFile::SomeSignal(SomeTypeDefinedInTheLinuxLibrary)

任何想法如何讓moc和#ifdefs一起玩?

回答

5

一個更好的解決方案是始終提供信號,並且僅在代碼中註釋掉在Windows上觸發它的代碼。這樣,所有平臺上的公共API都是相同的。

[編輯] moc工具真的很笨。它實際上並不瞭解代碼;相反它只是對某些模式做出反應。這就是爲什麼它忽略了#ifdef

爲了解決這個問題,請打包該類型或使用#ifndef __linux__並在其中定義您自己的虛擬類型,以便在Windows上編譯。由於信號不會在Windows上發射,插槽永遠不會被使用,因此任何使代碼編譯的類型都應該沒問題。

+0

我希望我能做到這一點,但與信號相關的參數類型是由linux專用庫定義的。如果我試圖在信號未被註釋掉的情況下在窗口下構建,那麼會出現未定義類型的錯誤。 – 2010-11-22 14:56:08

0

至少在使用Visual Studio的Qt 5.3中,我可以將預處理器宏傳遞給moc工具。爲了使這個工作,我不得不文本編輯我的Visual Studio項目文件,併爲每個文件手動添加命令行參數,以便將預處理器參數交給moc工具。您可以使用-D [預處理器],即-DSPECIAL_BUILD或-DSPECIAL_BUILD = 1,並且moc編譯器足夠智能,可以在代碼中查看#if SPECIAL_BUILD檢查,而不會嘗試moc這些部分。

只需搜索「moc.exe」併爲每個配置添加適當的參數。