在不同DLL之间传递的std对象 我相信我的问题的根源在于我依赖于一个用Visual C++ 2008编译的共享库,但是其他库是用Visual C++ 2010编译的。(目前,我自己使用Visual C++ 2010)< /P>

在不同DLL之间传递的std对象 我相信我的问题的根源在于我依赖于一个用Visual C++ 2008编译的共享库,但是其他库是用Visual C++ 2010编译的。(目前,我自己使用Visual C++ 2010)< /P>,c++,visual-c++,std,C++,Visual C++,Std,这些库严重依赖std。DLL中的某些函数需要std对象作为参数并返回std对象(例如std::string) 即使std库版本不同,是否可以使这些DLL与我的可执行文件兼容 这类问题应该有一个标准的解决方案,但我找不到。你能告诉我正确的方向吗?你可以使用不同版本msvc的std对象,我不知道是否有二进制兼容性 您可以搜索经常导致崩溃的对象破坏。在特定模块中创建的对象必须在该特定模块中删除,以便同一CRT处理该对象。如果不满足此条件,则行为未定义(可能是崩溃) 最安全的解决方案是封装所有对象在接口

这些库严重依赖std。DLL中的某些函数需要std对象作为参数并返回std对象(例如std::string)

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


这类问题应该有一个标准的解决方案,但我找不到。你能告诉我正确的方向吗?

你可以使用不同版本msvc的std对象,我不知道是否有二进制兼容性

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

最安全的解决方案是封装所有对象在接口中,参见.P/>

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

这类问题正是像COM这样的东西被发明的目的:一种在组件之间传递对象的安全方式


禁止将所有东西更改为COM,最好的办法是确保所有共享C++对象的库都是用同一编译器的同一版本构建的。如果无法使用较新的编译器重建这些DLL,则必须使用较旧的编译器编译代码。

到底是什么问题?撞车?编译器错误?链接器错误?找不到“标准解决方案”,因为没有。使用相同的编译器和完全相同的设置重新编译所有DLL,需要/MD。