从 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 导出一个类?的主要内容,如果未能解决你的问题,请参考以下文章

C++ DLL中的导出类在编译时会发出警告[重复]

导出 DLL C++ 类,关于 .def 文件的问题

从 C++ dll 编组导出的字符串向量

c++调用dll导出函数

在 C# 中找不到 C++ COM DLL 中的导出函数

未导出成员函数时,从 C# 调用 C++ 本机/非托管成员函数