什么会阻止我在使用 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/