什么会阻止我在使用 Visual Studio 2005 编译的程序中与使用 Visual Studio 2008 构建的第三方 .lib 链接?谢谢
问问题
218 次
2 回答
2
更新:这仅适用于 DLL,这是最初的问题。使用静态库,所有希望都消失了。
我将尝试总结一些事实:
- ABI 本身是兼容的,因此任何对所有数据类型和函数签名使用相同定义的代码都可以,但是
- 系统内部结构定义和系统包含文件可能已更改,除了
- ABI 的某些部分被定义为固定或向后兼容。
因此调用函数和方法是安全的,传递完全(即包括它们的成员)定义的数据类型
- 在与 DLL 匹配的头文件中,或
- 在 IDL 文件中(因为这些文件一旦发布就永远不会更改),或者
- 在另一个头文件中,包括系统头文件,如果保证定义是固定的
对于指针成员,如果从不取消引用指针,则规则会放宽。
现在棘手的部分:
- 系统分配器的内部数据结构不是不变集的一部分。由于指向已分配内存的指针也是指向紧接在它之前的分配结构的指针,因此永不取消引用规则适用。因此:
- 释放传入的内存是不安全的,除了
CoTaskMemAlloc()
/CoTaskMemFree()
。 - 只有在 DLL 中创建了对象时才能调用虚拟析构函数(这里计算的是new 表达式,而不是构造函数是否被导出)
- 仅当对象是在 DLL 之外创建时,才能调用非虚拟析构函数。
- 释放传入的内存是不安全的,除了
- STL 不是不变集的一部分,因此任何
struct
包含 STL 类型的都是不安全的。
于 2012-01-04T09:33:11.907 回答
0
- 混合 STL 和 Visual Studio 标头不起作用:混合来自不同版本 Visual Studio 的库时出现运行时问题
- 隔离非常困难:混合从不同版本的 Visual Studio 2002 及更高版本构建的 C 代码的静态库
于 2012-01-04T08:56:12.007 回答