std对象在不同的​​DLL之间传递

时间:2012-06-07 06:56:55

标签: c++ visual-c++ std

我认为我的问题的根源在于我依赖于使用Visual C ++ 2008编译的共享库,但其他库是使用Visual C ++ 2010编译的。(目前,我使用的是Visual C ++ 2010自己。)

这些图书馆严重依赖标准。 DLL中的某些函数需要std-objects作为参数并返回std-objects(例如std :: string)。

即使std库版本不同,是否可以使这些DLL与我的可执行文件兼容?

应该有这种问题的标准解决方案,但我无法找到它。你能指点我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

您可以使用来自不同版本的msvc的std对象,我不知道是否存在二进制兼容性。

您可以搜索经常导致崩溃的对象销毁。必须在该特定模块中删除在特定模块中创建的对象,以便相同的CRT处理它。如果不满足此条件,则行为未定义(可能是崩溃)

最安全的解决方案是封装接口中的所有对象,请参阅How to export C++ classes from dlls

答案 1 :(得分:1)

我听过Stephan T. Lavavej,有几次说,C ++对象的二进制兼容性不能保证在主要版本的编译器中,所以将STL对象传递给用另一个版本构建的组件中的API很可能有问题。请注意,许多STL对象都是模板,因此内联很多。如果跨越边界传递STL对象,那么内联可能会在两侧发生。如果使用STL的不同实现在边界的任一侧编译代码,则可能会遇到问题。

这些问题就像COM之类的东西被发明出来一样:在组件之间传递对象的安全方法。

除非将所有内容更改为COM,否则最好的办法是确保与C ++对象共享的所有库都使用相同编译器的相同版本构建。如果您无法使用较新的编译器重建这些DLL,则必须使用较旧的编译器编译代码。