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

发布于 2024-12-24 21:13:03 字数 81 浏览 1 评论 0原文

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

What could prevent me from linking with a third-party .lib built with Visual Studio 2008 in a program that I compile with Visual Studio 2005? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薄荷港 2024-12-31 21:13:03

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

我将尝试总结一些事实:

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

(即,包括其成员)定义的数据类型

  • 因此,调用函数和方法是安全的,传递完全在与 DLL 匹配的头文件中
  • IDL 文件中的数据类型(因为这些意味着一旦发布就永远不会改变),
  • 在另一个头文件(包括系统头文件)中,如果保证定义是固定的

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

现在是棘手的部分:

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

Update: This applies to DLLs only, which was the original question. With static libraries, all hope is lost.

I'll try to summarize a few facts:

  • The ABI itself is compatible, so any code that uses the same definitions for all data types and function signatures is fine, but
  • System internal structure definitions and system include files may have changed, except
  • Parts of the ABI are defined to be either fixed or backwards compatible.

Thus it is safe to call functions and methods, passing data types that are entirely (that is, including their members) defined

  • in the header files matching the DLL, or
  • in an IDL file (because these are meant to never change once published), or
  • in another header file, including system headers, if the definition is guaranteed to be fixed

For pointer members, the rule is relaxed if the pointer is never dereferenced.

Now the tricky part:

  • The internal data structures of the system allocator are not part of the unchanging set. As a pointer to allocated memory is also a pointer to the allocation structure immediately preceeding it, the never-dereference rule applies. Thus:
    • it is not safe to deallocate memory that was passed in, with the exception of CoTaskMemAlloc()/CoTaskMemFree().
    • a virtual destructor can only be called if the object was created inside the DLL (it is the new-expression that counts here, not whether the constructor is exported)
    • a nonvirtual destructor can only be called if the object was created outside the DLL.
  • The STL is not part of the unchanging set, so any struct containing STL types is unsafe.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文