以可移植方式将类导出到 dll,而无需使用接口

Exporting classes to a dll in a portable way, without using interfaces?

本文关键字:接口 dll 方式 可移植      更新时间:2023-10-16

我有一个关于共享库/.dlls和类导入/导出的问题。根据我经过一些研究后的理解,两种方法如下:

  • 只需在类之前使用 __declspec(dllexport/dllimport),并祈祷不同的编译器版本以相同的方式修改名称,并接受您的.dll不会被不同的编译器使用的事实。
  • 在 dll 中使用纯虚拟类作为接口。然后,所有需要导出的类都将从它们继承,并应实现虚函数。在这种情况下,.dll将导出的只是"工厂"构造/析构函数,它将创建和释放对象。
  • 这是我所知道的仅有的两种方式。第一个是禁忌,因为它提供 0 可移植性。第二种,虽然方便且对于实现目的的.dll进行良好的编程设计,但当您意识到需要为每个不同的构造函数使用不同的构造函数时,它开始很烦人,只能使用 POD 类型作为参数,并且您失去了C++类的许多优点,例如重载函数和默认函数参数。

    对于应该为用户提供库的.dll,例如,类的集合甚至第二种方式也变得非常不方便。所以我想知道这里的解决方案是什么?只是为每个主要编译器使用第一种方法编译不同的.dll?大型图书馆的共享库版本如何工作?例如,wxWidgets也提供了一个.dll版本。他们如何在避免接口解决方案的情况下实现.dll最终用户对类的正常使用?

    为每个编译器版本提供单独 DLL 的解决方案有效。同时,它仍然不是官方功能。你永远不会知道下一个服务包是否会破坏兼容性,没有人会给你确切的编译器/链接器密钥列表,这些密钥将保持/破坏兼容性等。我听到可靠的传言说Windows8终于以正确的方式实现了这一点。

    顺便说一下,Visual Studio 2012 Release Candidate 仍然可以从以下位置下载:http://msdn.microsoft.com/en-us/vstudio/bb984878.aspx。也许你应该尝试一下?