未解析的外部符号:QMetaObject const QwtPlotMagnifier::staticMetaObjec

Unresolved external symbol: QMetaObject const QwtPlotMagnifier::staticMetaObject

本文关键字:QMetaObject const QwtPlotMagnifier staticMetaObjec 符号 外部      更新时间:2023-10-16

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

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

这是错误(子类称为绘图放大镜(:

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。这一定是我愚蠢的错误。请启动我的大脑,有人!

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

DEFINES += QWT_DLL

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

检查,如果你的Visual Studio项目中有所有需要的包含。


C/C++ / Additional Include Directories这里应该是一条<qwt_dirinclude>的道路


Linker / General / Additional Library Directories这里应该是一条<qwt_dirlib>之路


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

此外,请检查您是否在ReleaseDebug配置中具有这些条目,在处理Release配置时,很容易仅Debug配置

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