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

C++ 以可移植的方式将类导出到dll,而不使用接口?,c++,c,dll,C++,C,Dll,我有一个关于共享库/.dll和类导入/导出的问题。根据我在一些研究后所了解的情况,有两种方法可以做到这一点: 只需在类之前使用uu declspec(dllexport/dllimport),祈祷不同的编译器版本以相同的方式损坏名称,并接受不同的编译器将无法使用.dll的事实 使用dll中的纯虚拟类作为接口。然后,所有需要导出的类都将从它们继承并实现虚拟函数。在这种情况下.dll将导出的只是“工厂”构造/析构函数,它将创建和释放对象。 这是我知道的唯一两种方法。第一个是否定的,因为它提供0可移植

我有一个关于共享库/.dll和类导入/导出的问题。根据我在一些研究后所了解的情况,有两种方法可以做到这一点:
  • 只需在类之前使用uu declspec(dllexport/dllimport),祈祷不同的编译器版本以相同的方式损坏名称,并接受不同的编译器将无法使用.dll的事实
  • 使用dll中的纯虚拟类作为接口。然后,所有需要导出的类都将从它们继承并实现虚拟函数。在这种情况下.dll将导出的只是“工厂”构造/析构函数,它将创建和释放对象。
  • 这是我知道的唯一两种方法。第一个是否定的,因为它提供0可移植性。第二种方法虽然方便,但对于实现某个目的的.dll来说是一种很好的编程设计,但当您意识到需要为每个不同的构造函数使用不同的构造函数时,它就开始让人恼火了,只能使用POD类型作为参数,并且失去了C++类的许多优点,例如重载函数和默认函数参数。
    对于一个应该为用户提供一个库的.dll来说,一个类的集合(例如第二种方式)会变得非常不方便。所以我想知道这里的解决方案是什么?只是用第一种方法为每个主要编译器编译一个不同的.dll?大型库的共享库版本是如何工作的?例如,wxWidgets也提供了.dll版本。如何让.dll的最终用户正常使用类,从而避免使用接口解决方案?

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


    顺便说一下,Visual Studio 2012候选发行版仍可从以下位置下载:。也许你应该试试看?

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