如何在C++中构建运行时版本无关的DLL?

pro*_*ron 12 c++ windows dll

我的产品是一个C++库,在Windows上,它作为dll发布.它几乎没有使用c-runtime(基本的iostream就是这样),所以我确信所有最新版本的CRT都没问题.

由于我的客户端应该使用我的dll构建他的应用程序,我不想强​​加给他任何特定的运行时版本.我希望我的dll绑定到我的客户端的应用程序正在使用的任何运行时库版本(我可以假设他将使用动态链接为他的CRT).毕竟,这不是动态链接的全部意义吗?那可能吗?

编辑:将dll与静态运行时库链接也不起作用,因为静态运行时(来自dll)和动态运行时(来自客户端的应用程序)将混合,这是不好的.

编辑:我主要问的是如何告诉运行时加载器链接我的DLL与应用程序链接的CRT?或许是清单上的东西?更一般地说,我的问题是如何构建一个表现良好的dll,客户可以使用它们构建自己的应用程序?

编辑:感谢答案中的建议,我已将所有对std类的引用转移到我的头文件中的内联函数,并将我的dll与静态运行时库相关联.现在它甚至可以在与不同CRT版本链接的应用程序中工作.

Cor*_*son 12

没有真正的方法可以确保您的DLL与多个运行时一起工作 - 它们之间发生变化的任何类型都可能导致不兼容.例如,对象的大小可以改变,或者成员的位置可以改变.对于这种事情,C++中几乎没有空间.

您可以做的最好的事情是静态链接到运行时并确保导出的API仅限于严格控制的类型 - 不传递std::string给函数,没有stdlib类型作为成员,并且不在new一个DLL和delete另一个DLL 中.不要为同一对象混合内联和导出函数(包括构造函数/析构函数),因为成员顺序和填充可能会在编译器之间发生变化.pimpl成语可能会有所帮助.

  • 由于这些复杂性,许多人避免导出运行时可移植的C++函数,但在那些人中通常会这样做. (2认同)
  • 解决此问题(在Windows中)的常用方法是使用COM.当然,COM本身在C++中产生和消费是一种痛苦,而版本控制往往是一个大问题.我更喜欢的解决方案是不使用C++ :) (2认同)

Luk*_*uke 6

如果您跨DLL边界公开任何C++对象,那么这是不可能的.您可以做什么(我们使用第三方DLL执行此操作)是在多个配置(32位/ 64位,调试/发布,静态/动态运行时,静态/动态库)中构建库以满足尽可能多的人.首先设置可能有点繁琐,但是一旦完成所有配置设置,只需构建它们即可.当然,您还需要考虑要构建的运行时(vc8,vc9,vc10等),因此如果要覆盖所有基础,则可能需要进行大量配置.