【问题标题】:.lib built with VS2008 used by a binary built with VS2005使用 VS2008 构建的 .lib 由 VS2005 构建的二进制文件使用
【发布时间】:2023-03-26 17:35:02
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    我将尝试总结一些事实:

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

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

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

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

    现在是棘手的部分:

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 一个自我回答的问题?你打算在维基上做这个吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2017-08-30
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2016-08-04
      相关资源
      最近更新 更多