将基于 QObject 的类导出到 DLL

Posted

技术标签:

【中文标题】将基于 QObject 的类导出到 DLL【英文标题】:Export QObject-based class to DLL 【发布时间】:2013-10-08 03:43:16 【问题描述】:

我正在编写一个派生自 QObject 的类,我想将这个类导出到一个 DLL 文件中,以便其他应用程序可以使用它。但是我在这里遇到了一些神秘的问题:

代码如下:

mydll.h:

 #ifndef MYDLL_H
 #define MYDLL_H

 #include "mydll_global.h"
 #include <QObject>
 #include <QDebug>

 class MYDLLSHARED_EXPORT MyDll : public QObject
 
     Q_OBJECT
  public:
     explicit MyDll(QObject * parent = 0);

     void test() const;
 ;

 #endif // MYDLL_H

mydll_global.h:

 #ifndef MYDLL_GLOBAL_H
 #define MYDLL_GLOBAL_H

 #include <QtCore/qglobal.h>

 #if defined(MYDLL_LIBRARY)
 #  define MYDLLSHARED_EXPORT Q_DECL_EXPORT
 #else
 #  define MYDLLSHARED_EXPORT Q_DECL_IMPORT
 #endif

 #endif // MYDLL_GLOBAL_H

mydll.cpp:

 #include "mydll.h"

 MyDll::MyDll(QObject * parent) :
     QObject(parent)
 
 

 void MyDll::test() const 
     qDebug() << "Hello from dll!";
 

并且该 dll 在另一个应用程序中使用。 dll编译成功。我已经使用这个 dll 在应用程序的.pro 文件中添加了LIBS += "myDll.dll",并且我已经将myDll.dll 复制到了应用程序的工作目录中。

编译器报告:

 C4273: "MyDll::qt_static_metacall" : inconsistent dll linkage.
 C2491: "MyDll::staticMetaObject": definition of dllimport static data member not allowed

这里有什么问题?

【问题讨论】:

C++ definition of dllimport static data member 的可能重复项 【参考方案1】:

您的mydll_global.h 代码检查是否定义了MYDLL_LIBRARY,但您发布的代码均未定义MYDLL_LIBRARY。这是否在您尚未在该问题上共享的文件中声明?如果没有,您需要在构建项目或 PCH 中添加#define MYDLL_LIBRARY

【讨论】:

你的意思是在创建这个dll的项目中添加#define MYDLL_LIBRARY,还是使用这个dll的项目? 创建此 dll 的项目。 #define MYDLL_LIBRARY 有效地让#ifdef 块内的编译器到Q_DECL_EXPORT 行,这告诉它导出标有MYDLLSHARED_EXPORT 宏的符号(在我的公司通常标记为MYDLLSHARED_API,因为它可以是出口或进口)。不定义MYDLL_LIBRARY 会使编译器命中Q_DECL_IMPORT 行,这会告诉它尝试导入这些符号,从而导致不一致的DLL 链接错误。希望有帮助!

以上是关于将基于 QObject 的类导出到 DLL的主要内容,如果未能解决你的问题,请参考以下文章

QT:将我的域对象基于 QObject 是一个好主意吗?

多部分上传在 QObject 中不起作用移动到线程

QObject 子类未检测到 QGuiApplication 事件循环

PyQt5 支持不从 QObject 继承的类中的信号

将 QMultiMap<QString, QString> 导出到 QML

Qt入门教程QObject篇元对象系统