2015-04-06 37 views
0

我有一个基类(QIndicator),我想在DLL中实现派生类。在Visual Studio 2012 DLL项目用于样本的派生类具有以下的代码:与基类尽管正确的dllExport没有功能导出到DLL - Visual Studio

头文件

#ifndef _DLL_COMMON_INDICATOR_ 
#define _DLL_COMMON_INDICATOR_ 

// define the DLL storage specifier macro 
#if defined DLL_EXPORT 
    #define DECLDIR __declspec(dllexport) 
#else 
    #define DECLDIR __declspec(dllimport) 
#endif 

class QIndicator 
{ 
    private: 
     int x; 
     int y; 
}; 

extern "C"  
{ 
    // declare the factory function for exporting a pointer to QIndicator 
    DECLDIR QIndicator * __stdcall getIndicatorPtr(void); 
} 

#endif 

源文件与派生类

#define DLL_EXPORT 

#include "indicator.h" 

class QIndicatorDer : public QIndicator 
{ 
    public: 
     QIndicatorDer  (void) : QIndicator(){}; 
     ~QIndicatorDer  (void){}; 

    private: 
     // list of QIndicatorDer parameters 
     int x2; 
     int y2; 
}; 

extern "C"  
{ 
    DECLDIR QIndicator * __stdcall getIndicatorPtr(void) 
    { 
     return new QIndicatorDer(); 
    }; 
} 

的我的问题是成功构建后,生成的DLL文件不包含导出的getIndicatorPtr函数(如DependencyWalker所示)。我检查了dllexport关键字是否正确传播到getIndicatorPtr的声明中。

另一个有趣的问题是,我已经在另一个DLL项目中有另一个派生类,就像我在几个月前创建的那样。这个较老的项目基本上是一样的,一切都很好。我检查了旧项目和当前项目的所有属性,它们看起来完全相同。所以我用完了想法,为什么我不能得到getIndicatorPtr导出。

任何帮助是非常赞赏, 丹尼尔

+0

为什么在这里使用'__stdcall'? – BitTickler 2015-04-06 13:10:35

+0

“QIndicator”类未导出。您也需要导出课程。 – BitTickler 2015-04-06 13:12:23

+0

在教程中发现它,诚实地(尝试所有知道互联网来解释这个DLL行为)..没有它的工作。 – 2015-04-06 13:12:52

回答

2

那是因为它没有被导出。为什么?

__declspec说明符应该只放在声明的一个函数中,而不是它的定义。此外,避免像#define DLL_EXPORT。预处理器定义应该在项目属性(MSVC)或命令行选项(例如GCC中的-D)中定义。

看你代码:

部首

extern "C"  
{ 
    DECLDIR QIndicator * __stdcall getIndicatorPtr(void); 
} 

当编译分析此报头,是认为DECLDIR作为dllimport(因为你定义.cppDLL_EXPORT)。然后在.cpp,它突然显示为dllexport。哪一个被使用?第一个。

所以,离开你的头(这是罚款),但变更来源:

//#define DLL_EXPORT -> remove this! 

#include "indicator.h" 

class QIndicatorDer : public QIndicator 
{ 
    //... 
}; 

extern "C"  
{ 
    /* DECLDIR -> and this! */ QIndicator * __stdcall getIndicatorPtr(void) 
    { 
     return new QIndicatorDer(); 
    }; 
} 

然后,转到项目属性(我假设你使用Visual Studio),然后C/C++ - >Preprocessor - >Preprocessor Definitions和那里添加DLL_EXPORT=1

这应该工作。

+0

Mateusz,谢谢!代码在您更改后生效。问候波兰! – 2015-04-06 13:39:37

+0

'__declspec'在定义中是正确的。将宏定义移动到项目属性是这里重要的一步。 – 2015-04-06 14:33:38

相关问题