需要从DLL导出纯基类吗?

时间:2010-02-04 16:23:00

标签: c++ dll interface export abstract-class

我有两个DLL a.dll和b.dll,每个都有一个类AClass和BClass 我想让AClass和BClass继承并实现相同的接口AbsBase,这是一个纯粹的抽象类 在每个类中,我为__declspec(dllimport)和__declspect(dllexport)设置了#defines。当我正在尝试编译时,我得到了这个:

警告C4275:非dll接口类'AClass'用作dll接口类'AbsBase'的基础

基本上要我将AbsBase声明为__declspec(dllexport)
但是如果编译器按照他的方式使用它,我将不得不声明从a.dll和b.dll导出AbsBase。

为什么需要导出类的接口?
它有什么办法吗? 我应该从两个DLL中真正导出AbsBase吗?这有什么本质上的错误吗? (我需要定义一个新的XXX_EXPORT宏..)

3 个答案:

答案 0 :(得分:3)

它看起来像是一个编译器警告而不是错误,所以它仍然可以工作。编译器只是让你知道你正在做的事情让你容易搞砸。只要两个DLL和核心程序都同意基类的定义,这样做是完全可以接受的。

您应该能够使用编译指示来抑制警告:

http://forums.devx.com/archive/index.php/t-84785.html

答案 1 :(得分:1)

这是值得担心的事情。编译器检测到基类中的代码可能会运行。它不是纯粹的虚方法,它知道如何过滤那些。也许是构造函数或析构函数?失败模式是类对象的内存布局在客户端代码与DLL中可能不同。这导致的运行时混乱非常难以诊断。

如果只要你可以保证客户端和DLL都使用完全相同的编译和链接设置进行编译,使用完全相同的CRT版本和那些工具,你就没问题了。您可以使用非标准__interface关键字而不是类来使基类保证抽象。

答案 2 :(得分:0)

我有一个提示:

class Base {
  public:
    virtual void f() = 0;
    virtual void g() = 0;
    virtual ~Base();
};

class A: public Base {
  public:
    virtual void f();
    virtual void g();
};

class B: public Base {
  public:
    virtual void g(); // REVERSE ORDER
    virtual void f();
};

虚方法表中f和g的顺序在基类中指定,非常需要此信息。