经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
QT 自定义插件问题 error: LNK2001: 无法解析的外部符号
来源:cnblogs  作者:永不停转  时间:2024/3/29 14:19:05  对本文有异议

为了重复利用已有的代码,我使用自定义插件进行开发。当每个插件独立开发时没有遇到问题,但是当插件B引用了插件A时就会在编译时报错 error: LNK2001: 无法解析的外部符号。
例如,先定义一个插件ColorPicker,用于颜色选取。关键代码如下:

  1. class QDESIGNER_WIDGET_EXPORT ColorPicker : public QWidget
  2. {
  3. Q_OBJECT
  4. Q_PROPERTY(QColor color READ getColor WRITE setColor NOTIFY colorChanged)
  5. public:
  6. explicit ColorPicker(QWidget *parent = nullptr);
  7. ~ColorPicker();
  8. QColor getColor() const;
  9. void setColor(QColor newColor);
  10. Q_SIGNALS:
  11. void colorChanged(const QColor oldColor, const QColor newColor);
  12. protected:
  13. void paintEvent(QPaintEvent *event);
  14. void mousePressEvent(QMouseEvent *event);
  15. private:
  16. QScopedPointer<ColorPickerPrivate> d_ptr;
  17. Q_DECLARE_PRIVATE(ColorPicker)
  18. };

该插件在APP中使用正常,但是当在另外一个插件LineProperty中使用ColorPicker 时就会报错。

  1. class QDESIGNER_WIDGET_EXPORT LineProperty : public QWidget
  2. {
  3. Q_OBJECT
  4. Q_PROPERTY(Qt::PenStyle lineStyle READ lineStyle WRITE setLineStyle NOTIFY lineStyleChanged FINAL);
  5. Q_PROPERTY(qreal lineWidth READ lineWidth WRITE setLineWidth NOTIFY lineWidthChanged FINAL);
  6. Q_PROPERTY(QColor lineColor READ lineColor WRITE setLineColor NOTIFY lineColorChanged FINAL);
  7. public:
  8. explicit LineProperty(QWidget *parent = nullptr);
  9. ~LineProperty();
  10. Qt::PenStyle lineStyle() const;
  11. void setLineStyle(Qt::PenStyle newLineStyle);
  12. qreal lineWidth() const;
  13. void setLineWidth(qreal newLineWidth);
  14. QColor lineColor() const;
  15. // 在UI中使用了ColorPicker 插件
  16. void setLineColor(const QColor &newLineColor);
  17. Q_SIGNALS:
  18. void linePropertyChanged(Qt::PenStyle style, QColor Color, qreal width);
  19. void lineStyleChanged(Qt::PenStyle style);
  20. void lineWidthChanged(qreal width);
  21. void lineColorChanged(QColor color);
  22. protected:
  23. bool eventFilter(QObject *watched, QEvent *event) override;
  24. private slots:
  25. void on_lineStyle_currentIndexChanged(int index);
  26. void on_lineColor_colorChanged(const QColor &oldColor, const QColor &newColor);
  27. void on_lineWidth_valueChanged(int arg1);
  28. private:
  29. QScopedPointer<LinePropertyPrivate> d_ptr;
  30. Q_DECLARE_PRIVATE(LineProperty)
  31. Q_DISABLE_COPY(LineProperty)
  32. };

网上大部分解决方法是这样的:

如果用到信号槽但类的定义没有放在.h文件中, qmake不会自动调moc, 你就需要写#include "moc_ColorPicker.cpp"告诉qmake你有文件需要moc

经过验证,在LineProperty .cpp文件末尾追加#include "moc_ColorPicker.cpp" 确实没有再报错。
实际上是编译器在LINK这个环节没有找到ColorPicker库文件,但是在pro文件中已经配置LIBS += -L$$OUT_PWD/../ColorPicker/release/ -lcolorpickerplugin
问题只可能是ColorPicker.h文件的定义问题。
ColorPicker类定义使用了QDESIGNER_WIDGET_EXPORT 宏,该宏用于将自定义组件类从插件导出给 Qt Designer 使用。查看QDESIGNER_WIDGET_EXPORT 的定义如下:

  1. #if defined(QDESIGNER_EXPORT_WIDGETS)
  2. # define QDESIGNER_WIDGET_EXPORT Q_DECL_EXPORT
  3. #else
  4. # define QDESIGNER_WIDGET_EXPORT Q_DECL_IMPORT
  5. #endif

LineProperty 引入ColorPicker.h文件时QDESIGNER_WIDGET_EXPORT 仍然解释为Q_DECL_EXPORT,从而导致ColorPicker库文件没有被导入到LineProperty ,所以LINK时会报错。

只需要修改ColorPicker.h文件定义,使用ColorPicker 专属的COLOR_PICKER_EXPORT即可:

  1. #if defined(COLOR_PICKER_LIB)
  2. #define COLOR_PICKER_EXPORT Q_DECL_EXPORT
  3. #else
  4. #define COLOR_PICKER_EXPORT Q_DECL_IMPORT
  5. #endif
  6. class COLOR_PICKER_EXPORT ColorPicker : public QWidget
  7. {
  8. ...略
  9. };

参考:
error LNK2001: 无法解析的外部符号 Qt的moc机制
vs+qt error LNK2001: 无法解析的外部符号 “public: static struct QMetaObject 。。

原文链接:https://www.cnblogs.com/ITnoteforlsy/p/18103770

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号