在使用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中的設置方法如下圖所示: