QT 自定义插件问题 error: LNK2001: 无法解析的外部符号
为了重复利用已有的代码,我使用自定义插件进行开发。当每个插件独立开发时没有遇到问题,但是当插件B引用了插件A时就会在编译时报错 error: LNK2001: 无法解析的外部符号。
例如,先定义一个插件ColorPicker,用于颜色选取。关键代码如下:
class QDESIGNER_WIDGET_EXPORT ColorPicker : public QWidget
{
Q_OBJECT
Q_PROPERTY(QColor color READ getColor WRITE setColor NOTIFY colorChanged)
public:
explicit ColorPicker(QWidget *parent = nullptr);
~ColorPicker();
QColor getColor() const;
void setColor(QColor newColor);
Q_SIGNALS:
void colorChanged(const QColor oldColor, const QColor newColor);
protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
private:
QScopedPointer<ColorPickerPrivate> d_ptr;
Q_DECLARE_PRIVATE(ColorPicker)
};
该插件在APP中使用正常,但是当在另外一个插件LineProperty中使用ColorPicker 时就会报错。
class QDESIGNER_WIDGET_EXPORT LineProperty : public QWidget
{
Q_OBJECT
Q_PROPERTY(Qt::PenStyle lineStyle READ lineStyle WRITE setLineStyle NOTIFY lineStyleChanged FINAL);
Q_PROPERTY(qreal lineWidth READ lineWidth WRITE setLineWidth NOTIFY lineWidthChanged FINAL);
Q_PROPERTY(QColor lineColor READ lineColor WRITE setLineColor NOTIFY lineColorChanged FINAL);
public:
explicit LineProperty(QWidget *parent = nullptr);
~LineProperty();
Qt::PenStyle lineStyle() const;
void setLineStyle(Qt::PenStyle newLineStyle);
qreal lineWidth() const;
void setLineWidth(qreal newLineWidth);
QColor lineColor() const;
// 在UI中使用了ColorPicker 插件
void setLineColor(const QColor &newLineColor);
Q_SIGNALS:
void linePropertyChanged(Qt::PenStyle style, QColor Color, qreal width);
void lineStyleChanged(Qt::PenStyle style);
void lineWidthChanged(qreal width);
void lineColorChanged(QColor color);
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
private slots:
void on_lineStyle_currentIndexChanged(int index);
void on_lineColor_colorChanged(const QColor &oldColor, const QColor &newColor);
void on_lineWidth_valueChanged(int arg1);
private:
QScopedPointer<LinePropertyPrivate> d_ptr;
Q_DECLARE_PRIVATE(LineProperty)
Q_DISABLE_COPY(LineProperty)
};
网上大部分解决方法是这样的:
如果用到信号槽但类的定义没有放在.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 的定义如下:
#if defined(QDESIGNER_EXPORT_WIDGETS)
# define QDESIGNER_WIDGET_EXPORT Q_DECL_EXPORT
#else
# define QDESIGNER_WIDGET_EXPORT Q_DECL_IMPORT
#endif
LineProperty 引入ColorPicker.h文件时QDESIGNER_WIDGET_EXPORT 仍然解释为Q_DECL_EXPORT,从而导致ColorPicker库文件没有被导入到LineProperty ,所以LINK时会报错。
只需要修改ColorPicker.h文件定义,使用ColorPicker 专属的COLOR_PICKER_EXPORT即可:
#if defined(COLOR_PICKER_LIB)
#define COLOR_PICKER_EXPORT Q_DECL_EXPORT
#else
#define COLOR_PICKER_EXPORT Q_DECL_IMPORT
#endif
class COLOR_PICKER_EXPORT ColorPicker : public QWidget
{
...略
};
参考:
error LNK2001: 无法解析的外部符号 Qt的moc机制
vs+qt error LNK2001: 无法解析的外部符号 “public: static struct QMetaObject 。。
QT 自定义插件问题 error: LNK2001: 无法解析的外部符号的更多相关文章
- vs2010+qt4编译出现error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject等错误
1.当vs2010编译qt时会出现以下错误: 1>------ 已启动全部重新生成: 项目: MyDialog, 配置: Debug Win32 ------ 1>生 ...
- error LNK2001: 无法解析的外部符号
1.错误描述 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl PadSystem::Private::printQS ...
- C++工程编译之“error LNK2001: 无法解析的外部符号”
今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是 ...
- error LNK2001: 无法解析的外部符号 _IID_IDirectDraw7
工程使用了DirectDraw,编译出错 error LNK2001: 无法解析的外部符号 _IID_IDirectDraw7 解决办法是吧dxguid.lib添加到工程中,把lib所在目录添加到工程 ...
- error LNK2001: 无法解析的外部符号 "public: char * __thiscall
error LNK2001: 无法解析的外部符号 "public: char * __thiscall CamPinPadCtrl::KeysConvert(unsigned long,ch ...
- 【转】strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号"int g_cTemplates"
加入了DirectShow的基类链接库后,如果此时编译就会出现以下编译错误: strmbasd.lib(wxutil.obj) : error LNK2019: 无法解析的外部符号 __imp__ti ...
- 无法链接glew的解决办法-编译开源库出现: error LNK2001: 无法解析的外部符号
无法链接glew的解决办法-编译开源库出现: error LNK2001: 无法解析的外部符号 参考官方配置指南:http://glew.sourceforge.net/install.html 1. ...
- error LNK2001: 无法解析的外部符号 _H5T_NATIVE_DOUBLE_g
最近在编译一个C++动态链接库时遇到一个奇怪的问题,我们基于GsTL实现了GIS地统计分析中的半变异函数分析以及 克吕格插值,GsTL在计算半变异函数时依赖HDF5库,当添加了HDF5的头文件.lib ...
- gSoap的“error LNK2001: 无法解析的外部符号 _namespaces”解决方法
错误 2 error LNK2001: 无法解析的外部符号 _namespaces 解决方法: 1. 在工程中定义 WITH_NONAMESPACES 宏 2.尝试 "#include &q ...
- 引用rtmp编译报错:rtmp.obj : error LNK2001: 无法解析的外部符号 __imp__timeGetTime@0
如题vs下引用librtmp的时候报错:rtmp.obj : error LNK2001: 无法解析的外部符号 __imp__timeGetTime@0 在link 里加入 winmm.lib 就可以 ...
随机推荐
- ORA-12514问题解决
版本:11.2.0.1.0 - 64bit 本机安装Oracle后链接测试发现以下情况: sqlplus scott/tiger 正常登陆 sqlplus scott/tiger@orcl 登陆失败 ...
- bootstrap与javascript
1.bootstrap依赖 bootstrap依赖javascript类库,jQuery 下载jQuery,在页面上应用jQuery 在页面上应用bootstrap的js类库 <script s ...
- 《深入理解Java虚拟机》(七) volatile 变量
目录 概述 一.内存模型 物理机内存模型 Java内存模型 Java内存模型中有如下的规定: 操作 二.Volatile变量 volatile修改变量后保证所有线程对其可见性 volatile禁止指令 ...
- k8s(Kubernetes) 常用命令配置
一.基础命令 $ kubectl create -f ./my-manifest.yaml # 创建资源 $ kubectl create -f ./my1.yaml -f ./my2.yaml # ...
- C++ sentry 如何压缩日志文件
项目中在使用 sentry 上传事件的 attachment 函数过程中发现,附带的 log 文件是未压缩的,于是有了需求,即需要在 sentry 内部将未压缩的文件流压缩后再上传给服务器 这个需求看 ...
- win32 - 关于GDI的RGB的数据分析
此文章为小结,仅供参考. 第一种情况,从桌面DC获取RGBA的数据. 32位 HDC hdc, hdcTemp; RECT rect; BYTE* bitPointer; int x, y; int ...
- 最新最简单安装龙蜥操作系统centos8
下载 https://openanolis.cn/download 我用的是稳定版本 Anolis OS8.2QU1 安装(vm用的15.5pro) 关键点 进去后,输入命令 ip a // 查看ip ...
- 用virtualenv创建虚拟环境
步骤 1.打开终端cmd,直接输入命令pip install virtualenv,前提已经将pip加入到环境变量中了 2.在e盘创建一个专门用来装虚拟环境的文件夹,如django_web_env 3 ...
- 【LeetCode二叉树#12】合并二叉树(巩固层序遍历)
合并二叉树 力扣题目链接(opens new window) 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果 ...
- 《HelloGitHub》第 95 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...