从C++ dll中导出一个类?

3

我该如何从一个dll中公开一个类?

导入dll的应用程序应该能够创建这个类的对象,并且也应该能够调用这个类的成员函数。

这是否类似于使用__declspec(dllexport)公开C类型函数?

而且,当我构建dll时(仅包含头文件中的类定义和cpp文件中的成员函数定义),没有相应的lib文件被创建。

5个回答

2

这里。请记住,您不能使用LoadLibrary()/GetProcAddress()来使用此导出类。


2
至少一个公共方法在导出的类中必须具有_declspec(dllexport)前缀,以创建lib文件。如果没有任何方法具有此前缀,则仅可用声明(即头文件),但是将无法实例化类(导出的构造函数对此是必要的)。如果至少有一个方法具有_declspec(dllexport)前缀,则编译器将理解dll用户必须能够链接到此dll。操作系统在加载exe链接到它们时会加载这些dll。
您可以考虑使用“工厂”方法来解决问题。例如,Symbian OS使用多态dll实现了这种方法。要执行此操作,您需要:
1. 在您的dll中声明(即头文件)和定义(即cpp文件)类。不需要其他任何东西。 2. 在您的dll中创建一个“工厂”函数,该函数将创建类的实例并返回指向它的指针。此函数必须具有_declspec(dllexport)前缀。 3. 与用户分享您的头文件和lib文件。 4. 用户包括头文件并链接到lib文件。 5. 用户调用工厂函数来实例化类(即创建对象),然后像正常类一样使用它。
上述5个步骤在Symbian OS中非常有效。您需要在自己的平台上尝试并发布结果。老实说,我在Windows上还没有尝试过。

1
实际上,我们可以将整个类声明为_declspec(dllexport),这将允许实例化类并调用成员函数(如上面答案中所述的链接)。 - Rakesh Agarwal

1
这与使用“_declspec(dllexport)”暴露C类型函数类似吗?
是的。而且__declspec可以应用于类。
没有创建对应的lib文件。
如果我没记错的话,这是默认值,但您可以覆盖默认链接器选项。

0

0
在Google搜索“class dllexport”时,MSDN的这个页面是第一个结果。
该页面似乎表明,只要有__declspec(dllexport)即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接