C ++中的DLL导出和继承
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++中的DLL导出和继承相关的知识,希望对你有一定的参考价值。
我试图从这样的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中使用基类时,它工作正常。
我究竟做错了什么?
有两种方法可以加载DLL。第一种是引用DLL中的一个或多个符号(例如,您的类名),提供适当的导入.LIB并让链接器解决所有问题。
第二种是通过LoadLibrary显式加载DLL。
这两种方法都适用于C级函数导出。您可以让链接器处理它,也可以按照您的说明调用GetProcAddress。
但是当涉及导出的类时,通常只使用第一种方法,即隐式链接到DLL。
好吧,我不知道如何解释这个,但我把派生类的构造函数的实现放在CPP文件而不是类定义中,错误就消失了...... 谢谢大家 :)
链接器抱怨它无法找到DerivedClass的构造函数。尝试明确声明它,定义它,并从DLL导出它:
DLL的头文件:
class DECLSPEC_TEST BaseClass
{
};
class DECLSPEC_TEST DerivedClass : public BaseClass
{
public:
DerivedClass();
};
DLL的源cpp文件:
DECLSPEC_TEST DerivedClass::DerivedClass() { }
编译DLL时,还有一个.lib文件。这是您的导入库。您需要链接到它才能连接到这些链接时依赖关系。
几件事要检查:
- 确保您链接到从DLL项目生成的EXACT .LIB文件。错误的是我们构建了两个项目,但目标项目中的LIB文件已经过时了。
- 确保在DLL项目中编译关联的CPP文件。不需要在所有方法上使用
__declspec
属性,因为您要导出整个类。 - 使用Dependency Walker,确保DLL实际上具有类及其所有方法都已导出。
- 确保两个项目中的.LIB文件之间没有64位/ 32位不匹配
我看到的唯一缺失的是在类声明后的分号;
。除此之外,出口应该正常。
还有一件事要检查:你是否将派生类中的构造函数声明为public
?
据我所知,在你的DerivedClass
中你宣布了一个非默认的构造函数(即与DerivedClass::DerivedClass()
不同)。
在这种情况下,编译器不会为您生成默认构造函数,因此您必须定义一个,因为由于某种原因您似乎使用了DerivedClass
的默认构造函数(可能在DerivedClass的实现中,不一定在代码中)使用DLL)。
默认构造函数不必在DLL接口中声明,但它应该在那里。
如果您不愿意使用默认构造函数,则需要注意以下几点:
在DerivedClass定义的private
部分声明一个默认构造函数。
这样,任何使用它的尝试都会产生编译器错误(而不是链接器错误),因此您知道在哪里尝试使用默认构造函数并可以修复它。
以上是关于C ++中的DLL导出和继承的主要内容,如果未能解决你的问题,请参考以下文章