如何从C ++中的DLL导出纯虚函数?

时间:2010-10-02 13:38:10

标签: c++ shared-libraries pure-virtual

我遇到一个奇怪的问题,即没有从DLL导出纯虚函数。 DLL编译并输出.dll文件到目录。但它不会产生.lib文件。

如果我给出定义并且它不再将remian视为纯虚拟,那么在愉快之后它会创建.lib文件。

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

例如“错误LNK2011:未解析的外部符号”public:.......“

有任何想法如何导出纯虚函数,以便可以为其他exe和dll实现它们

此致 乌斯曼

3 个答案:

答案 0 :(得分:8)

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

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

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

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

// etc.

现在,将dllexport / dllimport说明符添加到T类,将导出doSomething方法。

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

我自己使用这种模式是为了避免因为某种原因在虚拟方法存在之前调用虚拟方法或者它不再存在时(即在基础抽象类的构造函数或析构函数中)崩溃)。在调试模式下,它将启动调试器(::DebugBreak() Win32 API函数),在发布模式下,它将默默地执行任何操作。

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