使用QWT产生error LNK2001的原因及解决方案

来源:互联网 发布:烟台java培训班哪个好 编辑:程序博客网 时间:2024/05/21 11:24
使用QWT进行二维曲线绘制,使用方法如下:

classPlot:publicQwtPlot

{

Q_OBJECT

……

}

此时报错:error LNK2001:无法解析的外部符号"public: static struct QMetaObject const QwtPlot::staticMetaObject"

出现这样的连接错误一般都是由于QwtPlot类的头文件中没有加Q_OBJECT而导致的,QwtPlotQWT提供的类,怎么可能没有加Q_OBJECT宏呢?好吧,那就老老实实的跟踪打开QwtPlot类的头文件看看吧(没法查看QwtPlot.cpp文件,应为QWT通过动态库的方式提供这些类的)

classQWT_EXPORTQwtPlot:publicQFrame,public QwtPlotDict

{

Q_OBJECT

……

}

我晕!QwtPlot类加宏Q_OBJECT了,那为什么还会出现这个连接错误?这是什么原因?QWT已经是非常成熟的QT关于二维曲线绘制的开源框架了,也不可能会出现这样的低级错误。算了,换种使用方法试试吧:

classPlot:publicQwtPlot

{

//Q_OBJECT

……

}

注销掉派生类中的Q_OBJEXT,疯了。居然编译通过了!这又是什么原因?

由于预处理所带来的问题

QWT通过动态库抛出类的方式将类QwtPlot抛出供使用者使用,我们来看一下抛出地方时如何定义的(位于qwt_golbal.h):

#ifdefQWT_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的抛出类,否则就会出错!

原创粉丝点击