2010-09-06 106 views
5

我正在爲Windows平臺開發一個使用Qt 4.6,CMake 2.8和Visual Studio 2008的大型項目。cpp文件中的Qt,CMake,Visual Studio和Q_OBJECT

構建系統到目前爲止,都是標準的東西:我使用CMake的QT4_WRAP_CPP宏從頭文件生成moc文件,然後將其鏈接到add_executable命令的最終可執行文件中。一切都按預期工作。

此設置的唯一限制是我無法使用Q_OBJECT.cpp文件中定義小部件或幫助程序。這對於小的,特定於上下文的助手類非常方便,它們應該出現在他們使用的位置旁邊。

我試圖源文件(包括.H的.cpp)的整個列表傳遞給QT4_WRAP_CPP,而不只是頭文件,但不工作(連接失敗,因爲一些MOC相關符號未定義)。

我認爲問題是,對於一個給定的文件對了foo.hFoo.cpp中中,QT4_WRAP_CPP宏將在同一目錄下生成相同的moc文件(moc_foo.cxx)很明顯這意味着第一個文件將被第二個文件覆蓋,因此在鏈接時符號將丟失。

有沒有辦法解決或解決這個問題?舉例來說,我嘗試添加特定規則的形式Foo.cpp中

QT4_GENERATE_MOC(directory/foo.cpp directory/foo.moc) 

,然後在Foo.cpp中的末尾添加

#include "foo.moc" 

。我認爲這應該可行,但唉,Visual Studio只允許每個文件構建一個規則,並且文件已經有一個構建規則(編譯爲對象文件),所以這種方法不起作用,至少在Visual Studio中。

我有另一個想法是創建一個新的宏,說QT4_WRAP_CPP_WITH_PREFIX,基於QT4_WRAP_CPP(在份額/ cmake的-2.8 /模塊/ Qt4Macros.cmake定義),這將需要額外的前綴參數,會將這個前綴添加到生成的moc文件中。這樣,我會撥打QT4_WRAP_CPP_WITH_PREFIX兩次,一次撥打.h文件,一次撥打.cpp文件,具有不同的前綴。我只是不喜歡這種方法,我會亂搞CMake的Qt支持的內部,而不是使用公共API。

有什麼更好的想法嗎?

Cheerz,弗朗茨

+0

我不確定我是否明白這一點:「此設置的唯一限制是我無法在.cpp文件中使用Q_OBJECT定義小部件或幫助程序。」除了頭文件之外,你不需要運行MOC任何東西。 – 2010-11-03 09:48:23

+1

我發現偶爾在.cpp文件中定義一個小的幫助類很方便,並且不會在這個.cpp文件之外暴露它。爲此,我需要能夠在.cpp文件上運行MOC。我的文章中概述的'QT4_WRAP_CPP_WITH_PREFIX'宏方法就像一個魅力。 – 2010-11-05 11:03:56

+0

@FrançoisBeaune - 你有沒有想過這個解決方案?即使對於一些這種簡單的:#include <的QApplication> 的#include 的#include MyClass類:公共的QObject { Q_OBJECT }; int main(int,char * []) { MyClass myClass; return 0; } 我不知道如何MOC它,因爲它是在一個cpp文件(我試圖建立它正常情況下得到vtable錯誤)。 – 2012-10-29 18:39:27

回答

1

參考文檔 「使用MOC」(http://doc.qt.nokia.com/4.1/moc.html),你只需要輸入「富。 moc「在你的實現文件的末尾。由於您無法相應地調整構建規則,因此嘗試導出.pro文件並按照諾基亞文檔的建議應用構建規則。

2

最近的CMake的版本有哪些工作就像一個魅力對我來說 「automoc」: http://blogs.kde.org/2011/11/01/cool-new-stuff-cmake-286-automoc

只需在加的CMakeLists.txt:

set(CMAKE_AUTOMOC TRUE) 

,然後在CPP(如例子。 cpp)文件:

#include "example.moc" 

(* .moc必須與cpp文件的名稱匹配)。