将基于 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的主要内容,如果未能解决你的问题,请参考以下文章
QObject 子类未检测到 QGuiApplication 事件循环