2010-01-07 30 views
5

我們已經編譯了VS2005的QT 4.6和QWT 5.2.0。Qt,VS2005,Qwt - 無法使用派生自Qwt小部件的類中的Q_OBJECT

我們試圖從QwtDial派生一個類,派生類有插槽。所以,我們需要添加Q_OBJECT宏。然而,當我們這樣做,鏈接器嗆出這個錯誤:

錯誤LNK2001:無法解析的外部符號 「公用:靜態結構QMetaObject常量QwtDial :: staticMetaObject」(?staticMetaObject @ QwtDial @@ 2UQMetaObject乙@@)

我已經看着Qwt.dll與依賴,並且它具有該功能。使用十六進制編輯器查看.lib文件顯示它具有與該名稱重疊的字符串完全匹配的內容。

我們在路徑中有Qwt庫。實際上,如果我重命名這個lib,那麼它會給出一個錯誤,它找不到這個lib文件。所以,我們知道它正在尋找正確的lib。

如果我們跳過Q_OBJECT,那麼所有東西都會使用幾個QWT小部件(包括我們的非Q_OBJECT Qwt派生類)正確鏈接和繪製。

有誰知道什麼會導致這個真煩人的鏈接器問題?

UPDATE:

我已驗證我添加了Q_OBJECT的類肯定是​​越來越爲其生成一個MOC文件。鏈接器錯誤實際上來自這個生成的MOC文件:

moc_GaugeWidget1.obj : error LNK2001: unresolved external symbol "public: static 
    struct QMetaObject const QwtDial::staticMetaObject" 
    ([email protected]@@[email protected]@B) 

因此,它看起來像是一些非常典型和非常規的東西。該符號絕對在lib中。

回答

11

我遇到同樣的問題。那麼,我正在使用Qt4.4和VC2003更新一箇舊項目,而我正在使用QwtPlot而不是QwtDial。錯誤是:

LNK2001:無法解析的外部符號 「公用:靜態結構QMetaObject常量QwtPlot :: staticMetaObject」(staticMetaObject @ QwtPlot @@ 2UQMetaObject @@ B')

這一點。沒有其他的。我發現論壇參考文獻指出了調試/發佈混音的問題,並且可能與刪除Qt Designer插件有關。

這似乎對我很有用: 將行:「DEFINES + = QWT_DLL」添加到project.pro文件的頂部。

QMAKE project.pro

NMAKE釋放

+1

+1:謝謝,它幫助!我認爲,QWT中缺少定義開關。就像「如果在這個庫中使用,將QWT_DLL設置爲Q_DECL_EXPORT,否則將QWT_DLL設置爲空」。這就是爲什麼你應該設置QWT_DLL手動清空,如果使用QWT頭。 – 2011-07-05 12:53:43

+0

謝謝,它確實有效! – 2012-04-19 13:03:19

1

我不知道這個答案,但這裏有一些信息:

在我看來,你的派生類中沒有一個匹配moc_文件! moc文件通常在使用Q_OBJECT宏時使用......您項目的moc信息存儲在Makefile,Makefile.debug和Makefile.release文件中!正是這個文件告訴哪個.cpp文件需要一個moc文件,哪個不需要。

可以在QtAssistant找到關於MOC文件:http://qt.nokia.com/doc/4.6/moc.html

現在,檢查這一點,你需要在你的「生成」去夾,然後查找一個名爲「moc_yourDerivedClass.cpp」文件。

如果找不到任何匹配的文件,則需要使用yourderivedClass再次通過qmake進程...也許當您第一次使用qmake時,Q_OBJECT宏還沒有在類中,因此沒有moc文件已創建...

我希望它可以幫助你一點!

+0

我會建議你的東西,它可能不可實現,但可能會有助於期貨項目。我正在使用我的一位朋友開發的腳本包。你可以在這裏找到它: http://www.dprog.n​​et/joomla/index.php?option=com_content&view=article&id=39:qt-integration-scripts&catid=32:qt-integration-scripts&Itemid=47 那裏做一個小小的工作來設置它,比如說明你正在使用哪個VS,哪個Qt版本,你的.PRO文件在哪裏等等。然後,其他的一切都會自動完成,添加新的文件,創建。 PRI文件,vcproj文件...非常好... – 2010-01-08 07:18:30

+0

例如,當我添加一個文件時,我將它放在正確的文件夾中,放在我的.PRO文件旁邊。我啓動了一個名爲「generate_vcproj.bat」的腳本,腳本生成了一切......然後我使用「Launch_ide.bat」,我的VS也啓動了所有設置(moc文件) – 2010-01-08 07:21:33

+0

至於這個答案,不......這肯定是MOC文件。 (moc_GaugeWidget1.obj:error LNK2001:無法解析的外部符號「public:static struct QMetaObject const QwtDial :: staticMetaObject」(?staticMetaObject @ QwtDial @@ 2UQMetaObject @@ B))...所以,還有一些其他問題/錯誤正在進行。 – darron 2010-01-12 15:57:35

1

問題是與交通部file.You應QwtPlot定義中使用Q_DECL_EXPORT(或者一些別的東西喜歡它),它告訴編譯器這個類是其他圖書館使用但在moc文件dosn't中生成的類的部分包含這些,所以當您將這些庫鏈接到其他程序時,它不知道如何鏈接這些部分。 無論如何,我不知道如何告訴這些Qt!

1

與qwt 5.2.1,qt 4.6和VS2008完全相同的問題。相同的代碼在Linux中完美編譯。 所有moc文件都正確生成和處理,沒有發佈/調試混合庫,我將在有空的時候將它報告給qwt錯誤。

將QWT_DLL添加到定義列表(項目屬性 - > C++ - >預處理器 - >定義)確實可以解決問題!

0

嘗試在項目目錄中再次運行qmake。

$ qmake的-project

$ QMAKE -tp VC

這是固定的問題對我來說。閱讀許多人給出的「看起來像你有moc文件問題」的解釋,讓我不清楚該怎麼做。

我想我在這一個上造成了我自己的問題。在構建整個項目之前,我右鍵單擊並編譯了我的項目中的.ui文件。不知何故,這並沒有完全生成所有需要的文件。無論如何,如果你突然遇到以前不存在的問題,運行qmake是一件有用的事情。

但是,在我的項目設置中還有一件事我注意到了,沒有設置預處理器指令。運行qmake再次解決了這個問題。