从 C++ dll 导出一个类?
Posted
技术标签:
【中文标题】从 C++ dll 导出一个类?【英文标题】:Exporting a class from a C++ dll? 【发布时间】:2009-02-22 14:10:31 【问题描述】:如何从 dll 中公开一个类?
导入 dll 的应用程序应该能够创建类的对象,并且他应该能够调用类的成员函数。
是否类似于使用__declspec(dllexport)
公开C 类型函数?
而且当我构建 dll(它只包含头文件中的类定义和 cpp 文件中的成员函数定义)时,没有创建相应的 lib 文件。
【问题讨论】:
【参考方案1】:Here。请记住,您不能使用 LoadLibrary()/GetProcAddress() 来使用这个导出的类。
【讨论】:
【参考方案2】:导出的类中至少一个公共方法的定义必须有 _declspec(dllexport) 前缀才能创建 lib 文件。如果没有任何方法具有此前缀,则只有声明(即头文件)可用,但无法实例化该类(为此需要导出构造函数)。如果至少一个方法有 _declspec(dllexport) 前缀,那么编译器将理解 dll 用户必须能够链接到这个 dll。操作系统会在加载链接到它们的 exe 后立即加载此类 dll。
您可以考虑采用“工厂”方法来解决您的问题。例如,Symbian OS 使用多态 dll 实现了这种方法。为此,您必须:
在您的 dll 中声明(即头文件)并定义(即 cpp 文件)类。不需要其他任何东西。
在您的 dll 中创建一个“工厂”函数,该函数将为您的类创建一个实例并返回指向它的指针。此函数必须有 _declspec(dllexport) 前缀。
与您的用户共享您的头文件和 lib 文件。
用户包含头文件并与lib文件链接。
用户调用工厂函数实例化类(即制作对象),然后将其用作普通类。
上面的 5 个步骤在 Symbian OS 中很有效。您必须自己在您的平台上尝试并发布结果。坦率地说,我还没有在 Windows 上尝试过。
【讨论】:
事实上,我们可以将整个类声明为 _declspec(dllexport) ,这将允许实例化类并允许调用成员函数。 (如上述答案中的链接所示)。【参考方案3】:是否类似于使用
_declspec(dllexport)
公开C 类型函数?
是的。并且 __declspec 可以应用于类。
没有创建对应的lib文件
IIRC 这是默认设置,但您可以覆盖默认链接器选项。
【讨论】:
【参考方案4】:看看Def Files,另外第一个链接是Using __declspec(dllexport)
【讨论】:
【参考方案5】:谷歌搜索“class dllexport”导致this page from MSDN 作为第一个结果。
该页面似乎表明您只需拥有__declspec(dllexport)
即可。
【讨论】:
以上是关于从 C++ dll 导出一个类?的主要内容,如果未能解决你的问题,请参考以下文章