重載QwtPlot類編譯錯誤,需宏定義QWT_DLL才能使用QWT拋出類

在使用QWT進行二維曲線繪製,使用方法如下:

class Plot: public QwtPlot

{

   Q_OBJECT

……

}

此時報錯:error LNK2001: 無法解析的外部符號"public: static struct QMetaObject const QwtPlot::staticMetaObject"

出現這樣的連接錯誤一般都是由於QwtPlot類的頭文件中沒有加Q_OBJECT而導致的,QwtPlot是QWT提供的類,怎麼可能沒有加Q_OBJECT宏呢?好吧,那就老老實實的跟蹤打開QwtPlot類的頭文件看看吧(沒法查看QwtPlot的.cpp文件,應爲QWT通過動態庫的方式提供這些類的)

class QWT_EXPORT QwtPlot: public QFrame, public QwtPlotDict

{

    Q_OBJECT

……

}

       我暈!QwtPlot類加宏Q_OBJECT了,那爲什麼還會出現這個連接錯誤?這是什麼原因?QWT已經是非常成熟的QT關於二維曲線繪製的開源框架了,也不可能會出現這樣的低級錯誤。算了,換種使用方法試試吧:

class Plot: public QwtPlot

{

  //Q_OBJECT

……

}

       註銷掉派生類中的Q_OBJEXT,瘋了。居然編譯通過了!這又是什麼原因?OK!我已無能爲力,還是交給高手吧!……!五分鐘後,高手回覆了(不愧是高手)!

       由於預處理所帶來的問題

       QWT通過動態庫拋出類的方式將類QwtPlot拋出供使用者使用,我們來看一下拋出地方時如何定義的(位於qwt_golbal.h):

#ifdef QWT_DLL

#if defined(QWT_MAKEDLL)     // create a Qwt DLL library

#define QWT_EXPORT  __declspec(dllexport)

#define QWT_TEMPLATEDLL

#else                        // use a Qwt DLL library

#define QWT_EXPORT  __declspec(dllimport)

#endif

#endif // QWT_DLL

    我們應該怎麼理解上面這段代碼呢?只有在預處理的時候定義了 QWT_DLL才能使用QWT的拋出類,否則就會出錯!這個道理同樣適用於我們自己生成的動態庫,VS2008中的設置方法如下圖所示:


至此問題解決

發佈了29 篇原創文章 · 獲贊 18 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章