4

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

如果我给出定义并且它不再是纯虚拟的,那么它会愉快地创建 .lib 文件。

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

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

知道如何导出纯虚函数,以便可以为其他 exe 和 dll 实现它们

问候乌斯曼

4

3 回答 3

8

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

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

于 2010-10-02T13:57:27.050 回答
8

以下链接将澄清您的疑问

在 C++ 类中使用 dllimport 和 dllexport

无需导出仅具有虚拟/内联函数的类

于 2010-10-02T13:46:32.993 回答
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 函数),而在发布模式下,它会默默地什么都不做。

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

于 2010-10-02T15:55:06.807 回答