c++ - 使用 VS2008 构建的 .lib 由使用 VS2005 构建的二进制文件使用

标签 c++ visual-studio visual-studio-2008 visual-studio-2005 binary-compatibility

什么会阻止我在使用 Visual Studio 2005 编译的程序中链接使用 Visual Studio 2008 构建的第三方 .lib?谢谢

最佳答案

更新:这仅适用于 DLL,这是最初的问题。有了静态库,所有的希望都破灭了。

我将尝试总结一些事实:

  • ABI 本身是兼容的,因此任何对所有数据类型和函数签名使用相同定义的代码都可以,但是
  • 系统内部结构定义和系统包含文件可能已更改,except
  • 部分 ABI 被定义为固定或向后兼容。

因此调用函数和方法是安全的,传递完全(即,包括它们的成员)定义的数据类型

  • 在匹配DLL的头文件中,或者
  • 在 IDL 文件中(因为一旦发布就永远不会更改),
  • 在另一个头文件中,包括系统头文件,如果定义是固定的

对于指针成员,如果指针从未被取消引用,则规则放宽。

现在是棘手的部分:

  • 系统分配器的内部数据结构不是不变集合的一部分。由于指向已分配内存的指针也是指向紧接其之前的分配结构的指针,因此适用永不取消引用规则。因此:
    • 释放传入的内存是不安全的,CoTaskMemAlloc()/CoTaskMemFree() 除外。
    • 只有当对象是在 DLL 中创建时才能调用虚拟析构函数(此处重要的是 new 表达式,而不是构造函数是否导出)
    • 只有当对象是在 DLL 外部创建时才能调用非虚拟析构函数。
  • STL 不是不变集的一部分,因此任何包含 STL 类型的 struct 都是不安全的。

关于c++ - 使用 VS2008 构建的 .lib 由使用 VS2005 构建的二进制文件使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8724121/

相关文章:

c++ - 在网络摄像头图像中查找 ROI

c++ - 将 .cpp 文件编译为程序内部的 EXE(EXE 文件)

c++ - 什么是回调?它的用途是什么以及如何在 C++ 中实现

c# - 我可以从内存中的实例生成代码以便稍后重新创建它吗?

windows - 包含路径如何在 Visual Studio 中工作?

visual-studio - 如何在 VC++ 的解决方案中定义全局设置?

c++ - 内联命名空间和不明确的声明

c# - 在 C# 中检查每分钟的时间

visual-studio-2008 - 安装VS2008后,在winnt.h中出现编译错误

c# - 什么是 inproc 变量以及它们如何使 session 更快?