我的产品是一个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成语可能会有所帮助.
如果您跨DLL边界公开任何C++对象,那么这是不可能的.您可以做什么(我们使用第三方DLL执行此操作)是在多个配置(32位/ 64位,调试/发布,静态/动态运行时,静态/动态库)中构建库以满足尽可能多的人.首先设置可能有点繁琐,但是一旦完成所有配置设置,只需构建它们即可.当然,您还需要考虑要构建的运行时(vc8,vc9,vc10等),因此如果要覆盖所有基础,则可能需要进行大量配置.
| 归档时间: |
|
| 查看次数: |
2764 次 |
| 最近记录: |