以可移植的方式将类导出到dll,而不使用接口?

时间:2011-05-22 03:06:43

标签: c++ c dll

我有一个关于共享库/ .dll和类导入/导出的问题。根据我在一些研究后所理解的,有两种方法可以做到:

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

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

    1 个答案:

    答案 0 :(得分:0)

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

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