2013-10-08 24 views
3

我正在编写一个从QObject派生的类,我想将该类导出到DLL文件中,以便其他应用程序可以使用它。但我得到了一些神秘问题就在这里:将基于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 i在另一个应用程序中使用。该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 

这里有什么问题吗?

+0

[dllimport静态数据成员的C++定义]的可能的重复(http://stackoverflow.com/questions/3491990/c-definition-of-dllimport-static-data-member) – sashoalm

回答

3

您的mydll_global.h代码检查是否定义了MYDLL_LIBRARY,但是您没有发布的代码定义了MYDLL_LIBRARY。这是否在你没有分享过这个问题的文件中声明?如果不是,则需要在构建项目或PCH中添加#define MYDLL_LIBRARY

+0

您的意思是添加'#define MYDLL_LIBRARY '在创建这个dll的项目中,还是使用这个dll的项目? – user2826776

+1

创建此dll的项目。 '#define MYDLL_LIBRARY'有效地让'#ifdef'块中的编译器到达'Q_DECL_EXPORT'行,它告诉它将导出标有'MYDLLSHARED_EXPORT'宏的符号(在我公司通常标记为“MYDLLSHARED_API”因为它可以导出或导入)。没有定义'MYDLL_LIBRARY'就会让编译器碰到'Q_DECL_IMPORT'这行,它告诉它试图导入这些符号,导致不一致的DLL链接错误。希望有所帮助! – iamtheddrman