代码之家  ›  专栏  ›  技术社区  ›  Martin Ba

VS2017和VS2015应用程序与dll之间的官方二进制不兼容是否准确?

  •  0
  • Martin Ba  · 技术社区  · 7 年前

    -MS docs声明VS2015和VS2017 LIB之间的二进制兼容性为 ,而我认为这必然是双向的。陷阱在哪里?


    背景/相关问题:

    我发现令人困惑的限制是:

    这条规则有两个例外。在以下情况下,无法保证二进制兼容性:

    消费时 使用版本更高的工具集构建的库 . 例如,与编译器版本19.12编译和链接的程序可以使用19.0到19.12编译的库。

    这个警告在技术上既草率又令人困惑。技术原因是什么?

    我说它是草率的,因为它是不完整的,因为可执行文件和DLL之间的接口是相当对称的,但这个项目符号只涵盖“应用程序”。

    具体来说, 假设所有模块都是根据动态CRT版本构建的,并且此动态CRT版本是可用的最新版本,我看到了以下组合,其中二进制兼容是一个问题:

    • my_2017.exe <-> my_2015.dll --表面上支持
    • my_2015.exe <-> my_2017.dll --似乎不受支持
    • my_2017.exe <-> my_2015.dll <-> my_2017_x.dll

    必须双向运行 ,我不太明白我们在这里会突然出现不兼容:API调用可以双向进行(回调等),对象可以双向“移动”,甚至DLL加载的顺序也可以混合。

    如前所述 是 有限:

    • 如果我的应用程序想要使用任何 VC14* 在编译库时,我“正式”仍然必须确保我的应用程序是用“最新版本”构建的。
    • VC14* DLL是否兼容?
    • 有了VCRedist,我们有了 这种情况似乎 不支持 允许 从2015应用程序中消费VC2017库(本例中为CRT)!

    那么,为什么(!)这在某种程度上是有限的吗?它与dll之间的依赖关系以及反向(!)有什么关系CRT dll版本要求。

    0 回复  |  直到 7 年前
        1
  •  1
  •   Martin Ba    7 年前

    已经更新了他们的文档 https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017 内容如下:

    ...

    比使用的任何工具集版本

    https://github.com/MicrosoftDocs/cpp-docs/commit/a505dccfb31eb49c2ffece4dabd24a0a61b1fcb3#diff-d488b4c71be450b2a39cdce495c229bf

    这方面没有直接的GitHub/MS文档问题,但这个限制更有意义:它只是讨论了 ,并且要求VC运行时版本至少与当前使用的最新模块相同。

    当然,我在问题中所说的仍然有效:任何(旧)VS2015应用程序都必须与(新)VS2019可再发行兼容,因此我猜想VCRedist-VC14.0曾经公开的所有界面都应该是二进制兼容的。

    推荐文章