2013-10-08 57 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