2010-10-02 223 views
4

我有一个奇怪的问题,没有纯虚函数从DLL导出。 DLL编译并输出为.dll文件到目录。但它不会生成.lib文件。如何从C++中的DLL导出纯虚函数?

如果我给出定义,它不再是remual作为纯虚拟,然后它愉快地创建.lib文件。

我需要实现工厂模式,我需要分离接口和实现。我的工厂实现和其他使用想要.dll(whome .lib文件不生成)的接口需要使用该导出函数,并且当我使用这些函数时,它们会产生链接错误...

例如“error LNK2011:解析外部符号“公用:.......”

有任何一个知道如何导出纯虚函数,使他们能够对其他的exe和dll的

问候 乌斯曼

+0

[不需要导出只有虚拟/内联函数的类?](http:// stackoverflow。com/questions/549983 /不必要的出口类只带虚拟内联函数) – 2010-10-02 14:23:09

回答

6

当您导出从​​正在创建该DLL中一些具体的外部可见名DLL的​​东西 - 一个定义的函数或类。如果没有这些,导入项目(引用该DLL的项目)的链接步骤无法解析导出DLL中的函数和类的所有必需的引用。

对于纯虚拟函数,导出DLL中没有具体的“事物”:不存在可链接的名称来解析对纯虚函数的外部调用 - 如果存在,则根据定义它将不是纯粹的。在这种情况下,所需要的只是纯虚函数的编译时可访问头文件中的声明,以便导入EXE或DLL知道如何用具体函数覆盖它。

1

在C++中,您可以定义纯虚拟方法。例如:

// T.hpp 
class T 
{ 
    public : 
     virtual void doSomething() = 0 ; 
     // etc. 
} ; 

。现在

// T.cpp 
void T::doSomething() 
{ 
} 

// etc. 

,与加在T类DLLEXPORT/dllimport的符,你doSomething方法将用于出口。

定义纯虚拟方法的主体的关键是确保用户会覆盖该方法,同时仍提供默认实现。

我自己使用这种模式是为了避免在出于某种原因,虚拟方法在存在之前被调用,或者当它不再存在时(即,在基础摘要的构造函数或析构函数中类)。在调试模式下,它将启动调试器(::DebugBreak() Win32 API函数),并且在发布模式下,它将默默无闻。

但是这种模式也可以用来解决你的问题,如果你真的需要导出你的纯虚函数的话。

+0

就我个人而言,当客户端程序员拧紧时,我认为崩溃可以默默无闻地做任何事情。 – 2010-10-02 17:32:06

+0

@John Dibling:我同意,但至少,重载纯虚拟方法让用户选择。就我而言,我会记录该问题,然后抛出一个运行时异常,并显示消息“您调用了此方法,这是错误的,等等等等等等”。 – paercebal 2010-10-02 18:11:06