1

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

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

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

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

4

2 回答 2

1

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

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

最安全的解决方案是将所有对象封装在接口中,请参阅如何从 dll 中导出 C++ 类

于 2012-06-07T08:28:10.353 回答
1

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

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

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

于 2012-06-07T15:52:49.203 回答