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

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

 

        至此问题解决。

        补充说明:记得当时,这个问题在使用QTCreator编译的时候是不会出现的,转换到VS平台下编译才出现的这个问题。由此问题可以联想到在使用第三方开源库时都会遇到相应的问题。再回顾一下,VS使用第三方开源库时需要配置的内容:

        (1)头文件包含目录include的路径

        (2)动态库的目录lib的路径

        (3)链接器--附加依赖项中,添加将要使用的lib库的名字

        (4)预处理

        这篇文章是我上班时候写的,当时发布于百度博客,由于百度博客空间被百度无辜封掉,以此为契机开始在CSDN上开始新的技术博客旅程。


我们团队有着十几年的期货程序化交易算法与软件研发经验,基于C++ Qt技术研发了具有自主知识产权的期货智能程序化交易一体化系统平台,该平台封装了二百多个量化指标,具有低时延、高性能、小滑点、可定制和跨平台的特点。团队致力于将人工智能技术与传统的程序化交易技术相结合为客户提供灵活可定制的期货智能程序化交易服务和产品。

       

        2012年6月19日于北京邮电大学新科研楼302

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值