【问题标题】:Are Visual C++ 2013 binaries compatible with Visual C++ 2017 binaries?Visual C++ 2013 二进制文件是否与 Visual C++ 2017 二进制文件兼容?
【发布时间】:2018-10-04 23:56:35
【问题描述】:

在我们的一个 C++ 解决方案中,我们使用了第三部分库。这些库与 VS 2013 兼容。现在我们正在将我们的解决方案迁移到 VS 2017,发现某些 3rd 方库没有与 VS 2017 兼容的版本。

所以我们尝试在 VS20173 中使用一些与 VS2013 兼容的库,并且尝试过的 API 调用工作正常。

我可以假设这些库与 VS 2017 可执行文件一起使用没有任何问题吗?

【问题讨论】:

  • C++ 库的答案是否定的。 C 库可能会起作用。我会等待有人证明我错了。
  • API 导出为函数而不是 C++ 类
  • 如果它们导出 C 风格的 API,那么它们是兼容的。请注意,“C 样式 API”不仅意味着“API 被导出为函数而不是 C++ 类”,而是所有函数都是“外部 C”,仅使用 C 类型作为参数/返回值而不是抛出。
  • @VTT 不,一般来说不是。它们具有不同的运行时 DLL,如果您在使用 VC++2017 编译的应用程序中创建类似 FILE* 的简单内容并将其传递给旧库,则无法保证它会正常工作。
  • 只是添加到其他一些 cmets:注意内存管理。您不能使用一种运行时支持进行分配并在另一种运行时支持中取消分配。

标签: c++ visual-studio visual-studio-2013 visual-studio-2017


【解决方案1】:

一般来说 - 没有。 AFAIK、VC++2015(又名工具集 v140)和 VC++2017(又名工具集 v141)被声明为二进制兼容。在 VC++2013 中没有做出这样的声明,我相信存在重大变化(如 sizeof(list) 等)。

它可能有效,但可能导致难以调试的问题

微软声明:

“一种更严重的变化,破坏性变化会影响二进制兼容性,但这种二进制兼容性中断只发生在 Visual Studio 的主要版本之间。例如,在 Visual Studio 2013 和 Visual Studio 2015 之间。”

https://docs.microsoft.com/en-us/cpp/porting/visual-cpp-change-history-2003-2015

【讨论】:

    【解决方案2】:

    没有任何保证,但 Visual C++ 编译器的二进制兼容性通常比官方宣布的要好。只需确保不要在不同的运行时创建/销毁对象、传播异常并且不要将 STL 相关对象作为参数传递。

    如果第三方库公开 C 样式接口并将它们编译为 DLL,则任务会更加容易。因此,您应该查看这些接口并验证它们与一般互操作性指南的差异有多大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      相关资源
      最近更新 更多