【问题标题】:Unresolved external symbol: QMetaObject const QwtPlotMagnifier::staticMetaObject未解析的外部符号:QMetaObject const QwtPlotMagnifier::staticMetaObject
【发布时间】:2017-03-20 11:35:44
【问题描述】:

我有一个使用 QwtPlotMagnifier 的库,以及其他 Qwt 类。我决定继承 QwtPlotMagnifier 以便在重新缩放绘图时发出信号。 库 (mylib.lib) 已编译,但使用它的应用程序现在抱怨与 QwtPlotMagnifier 的 moc 输出相关的未解析外部。

我正在静态链接 qwt;因此,在最低级别的库中拥有预处理器指令 QWT_DLL 的要求在这里不适用。

这是错误(子类称为 PlotMagnifier):

mylib.lib(moc_PlotMagnifier.obj) : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QwtPlotMagnifier::staticMetaObject" (?staticMetaObject@QwtPlotMagnifier@@2UQMetaObject@@B)

子类声明没什么特别的:

#pragma once

#include "qwt_plot_magnifier.h"
/**
subclass of QwtPlotMagnifier to provide a signal when zooming is complete
*/
class PlotMagnifier : public QwtPlotMagnifier
{
    Q_OBJECT
public:
  explicit PlotMagnifier(QWidget *w);
  virtual ~PlotMagnifier();
signals:
  void rescaled();
protected:
  virtual void rescale(double factor);  
};

我正在使用 Visual Studio 2013 fwiw。我的应用程序仍然像往常一样包含 qwtd.lib。这一定是我的一个愚蠢的错误。请启动我的大脑,有人!

【问题讨论】:

    标签: c++ qt qwt


    【解决方案1】:

    将此行添加到 .pro 文件中,为编译器提供外部符号提示:

    DEFINES += QWT_DLL
    

    在文件qwt_global.h 中有宏。没有这个宏,编译器会认为这是一个内部符号。

    【讨论】:

    • 我以为我已经解决了上述两点 - 我正在使用 MSVC 进行编译,所以我没有要设置的 CONFIG(而且我已经成功地使用了 QWT)。另外我静态链接qwt,所以我不需要QWT_DLL;事实上,如果我定义这个,我会得到错误的地方
    • 我收回!清理和重建后,我可以使用 QWT_DLL 进行编译。这解决了问题,非常感谢!
    【解决方案2】:

    检查一下,您的 Visual Studio 项目中是否包含所有需要的内容。

    C/C++ / Additional Include Directories
    这里应该是<qwt_dir\include>的路径

    Linker / General / Additional Library Directories
    这里应该是<qwt_dir\lib>的路径

    Linker / Input
    应包括qwtd.lib(用于debug 配置)和qwt.lib(用于release

    另外,请检查您在 ReleaseDebug 配置中是否有这些条目,很容易只配置 Debug,同时处理 Release 配置。

    另外,请检查您的项目视图中Generated Files 下的PlotMagnifier 是否有moc_* 文件(类似于moc_plotmagnifier.cpp),有时Qt 插件无法添加它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-19
      • 2022-08-06
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      相关资源
      最近更新 更多