【问题标题】:Exporting classes to a dll in a portable way, without using interfaces?以可移植的方式将类导出到 dll,而不使用接口?
【发布时间】:2011-05-22 03:06:42
【问题描述】:

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

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

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

    【问题讨论】:

    • C++ 没有标准的 ABI。如果您想要真正的可移植性,则必须坚持使用 C。
    • 我理解这一点,并且知道唯一真正可移植的语言是 C,但我的问题仍然存在。像 wxWidgets 这样的大型可移植库如何管理动态/共享库?
    • 我相信 wxWidgets 以源代码的形式分发,让你为你的编译器自己构建它。
    • 是的,这是真的,我的例子根本不是一个好例子。假设您要构建一个 API、一个复杂的类和函数集合,并希望通过 .dll 以可移植的方式将这些公开给用户。除了默认接口没有别的办法吗?
    • 您必须为每个编译器版本发布一个 DLL。如果您知道您的用户使用 VC++,那么您可以坚持下去。

    标签: c++ c dll


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 2015-09-05
      相关资源
      最近更新 更多