Qt5:LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const Newspaper::staticMeta

环境:
win10
QT5.15.2
MSVC2019

使用自己编译好的QWT库,打算重载 QwtPlotZoomer。
然而,始终有如下报错:
Qt5:LNK2001: 无法解析的外部符号 "public: static struct QMetaObject const Newspaper::staticMeta

QT error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObjec

多次检查,Q_OBJECT也加了, 不应该有问题呀?
所以这一种解释可以排除:
“只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。”

然而,对于QWT,则有些许不同。
高手回复是:

由于预处理所带来的问题

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

针对VS,增加相应的的 预处理定义即可。

LNK2001 是 Microsoft Visual C++ 编译器在链接阶段报告的错误,表示某个符号在目标文件中找不到定义。在 Qt 项目中,涉及 `staticMetaObject` 的 LNK2001 错误通常与 Qt 的元对象系统(Meta-Object System)有关,特别是与 `Q_OBJECT` 宏、信号与槽机制或 `moc`(Meta-Object Compiler)处理有关。 对于 `QwtPlotZoomer` 的 `staticMetaObject` 无法解析的问题,可能原因和解决方法如下: ### 1. **未正确使用 Q_OBJECT 宏** 如果用户自定义了一个继承自 `QwtPlotZoomer` 的类,并且希望使用信号与槽机制,则必须在类定义中包含 `Q_OBJECT` 宏。遗漏该宏会导致 `moc` 不生成相应的元对象代码,从而链接器找不到 `staticMetaObject` 的定义。 ```cpp class MyZoomer : public QwtPlotZoomer { Q_OBJECT // 必须包含此宏 public: explicit MyZoomer(QWidget *canvas); }; ``` ### 2. **未正确运行 moc 工具** Qt 的 `moc` 工具负责生成元对象代码。如果 `QwtPlotZoomer` 或其子类使用了 `Q_OBJECT` 宏但未被 `moc` 处理,则链接器将无法找到 `staticMetaObject` 的实现。确保项目构建系统(如 qmake 或 CMake)已正确配置以处理 `moc`。 在 `.pro` 文件中应包含: ```qmake QT += widgets CONFIG += c++11 ``` 确保项目中包含所有必要的 `moc` 步骤,并检查构建输出目录是否生成了对应的 `moc_*.cpp` 文件。 ### 3. **Qwt 库未正确编译或链接** 如果使用的是自定义编译的 Qwt 库,需确保该库的构建配置与当前项目一致,包括 Qt 版本、编译器版本、构建模式(Debug/Release)、是否启用了 `Q_OBJECT` 支持等。若 Qwt 库未启用 Qt 的元对象支持,可能导致 `QwtPlotZoomer` 的 `staticMetaObject` 未被导出。 在编译 Qwt 时,确认其源码中 `QwtPlotZoomer` 的定义是否包含 `Q_OBJECT` 宏,并确保其构建过程生成了相应的 `moc` 文件并链接到最终的库中。 ### 4. **项目配置中未正确包含 Qt 元对象支持** 在某些构建系统中(如 CMake),如果未正确设置 `AUTOMOC` 选项,可能导致 `moc` 未被自动调用。 在 CMakeLists.txt 中应包含: ```cmake set(CMAKE_AUTOMOC ON) find_package(Qt5 COMPONENTS Widgets REQUIRED) ``` 确保项目构建时自动处理所有需要 `moc` 的类。 ### 5. **清理并重新构建项目** 有时旧的目标文件或缓存可能导致链接错误。尝试执行完整的项目清理并重新构建: ```bash qmake clean qmake qmake build ``` 或在 IDE 中选择“Rebuild All”。 ### 6. **检查 QwtPlotZoomer 是否被正确导出** 如果 `QwtPlotZoomer` 是从 DLL 导出的类,需确保其定义前有 `QWT_DLL` 宏,并在使用该类的模块中定义 `QWT_DLL`。否则可能导致某些符号(如 `staticMetaObject`)未被正确导出。 ```cpp class QWT_EXPORT QwtPlotZoomer : public QwtPlotPicker { Q_OBJECT ... }; ``` 确保在构建和使用 Qwt 时,宏定义一致。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W001123456789

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值