C ++中的DLL导出和继承

问题描述 投票:5回答:7

我试图从这样的DLL导出一个类及其基类:

#ifdef MY_EXPORTS
    #define DECLSPEC_TEST __declspec(dllexport)
#else
    #define DECLSPEC_TEST __declspec(dllimport)
#endif


class DECLSPEC_TEST BaseClass
{
  // stuff.
};

class DECLSPEC_TEST DerivedClass : public BaseClass
{
  // This class only has a constructor which initializes the class differently.

};

但我尝试在另一个DLL中使用此类,我不断收到错误:

error LNK2019: unresolved external symbol 
"__declspec(dllimport) public: __thiscall DerivedClass::DerivedClass(void)"
 (__imp_??0DerivedClass@@QAE@XZ) referenced in function 
"public: __thiscall SomeOtherClass::SomeOtherClass(void)" (??0SomeOtherClass@@QAE@XZ)  

我还用PE Explorer查看了我的导出DLL,我在导出列表中看不到派生类。

当我尝试在我的其他DLL中使用基类时,它工作正常。

我究竟做错了什么?

c++ inheritance dll export
7个回答
3
投票

有两种方法可以加载DLL。第一种是引用DLL中的一个或多个符号(例如,您的类名),提供适当的导入.LIB并让链接器解决所有问题。

第二种是通过LoadLibrary显式加载DLL。

这两种方法都适用于C级函数导出。您可以让链接器处理它,也可以按照您的说明调用GetProcAddress。

但是当涉及导出的类时,通常只使用第一种方法,即隐式链接到DLL。


3
投票

好吧,我不知道如何解释这个,但我把派生类的构造函数的实现放在CPP文件而不是类定义中,错误就消失了...... 谢谢大家 :)


2
投票

链接器抱怨它无法找到DerivedClass的构造函数。尝试明确声明它,定义它,并从DLL导出它:

DLL的头文件:

class DECLSPEC_TEST BaseClass
{
};

class DECLSPEC_TEST DerivedClass : public BaseClass
{
public:
    DerivedClass();
};

DLL的源cpp文件:

DECLSPEC_TEST DerivedClass::DerivedClass() { }

1
投票

编译DLL时,还有一个.lib文件。这是您的导入库。您需要链接到它才能连接到这些链接时依赖关系。


1
投票

几件事要检查:

  1. 确保您链接到从DLL项目生成的EXACT .LIB文件。错误的是我们构建了两个项目,但目标项目中的LIB文件已经过时了。
  2. 确保在DLL项目中编译关联的CPP文件。不需要在所有方法上使用__declspec属性,因为您要导出整个类。
  3. 使用Dependency Walker,确保DLL实际上具有类及其所有方法都已导出。
  4. 确保两个项目中的.LIB文件之间没有64位/ 32位不匹配

0
投票

我看到的唯一缺失的是在类声明后的分号;。除此之外,出口应该正常。

还有一件事要检查:你是否将派生类中的构造函数声明为public


0
投票

据我所知,在你的DerivedClass中你宣布了一个非默认的构造函数(即与DerivedClass::DerivedClass()不同)。

在这种情况下,编译器不会为您生成默认构造函数,因此您必须定义一个,因为由于某种原因您似乎使用了DerivedClass的默认构造函数(可能在DerivedClass的实现中,不一定在代码中)使用DLL)。

默认构造函数不必在DLL接口中声明,但它应该在那里。

如果您不愿意使用默认构造函数,则需要注意以下几点:

在DerivedClass定义的private部分声明一个默认构造函数。

这样,任何使用它的尝试都会产生编译器错误(而不是链接器错误),因此您知道在哪里尝试使用默认构造函数并可以修复它。

© www.soinside.com 2019 - 2024. All rights reserved.