首页 > 解决方案 > 关于“Visual Studio 2015 和 Visual Studio 2017 之间的二进制兼容性”的问题

问题描述

https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2017表示保证 Visual Studio 2015 和 Visual Studio 2017 之间的 C++ 二进制兼容性,但以下情况除外:

1)当使用 /GL 编译器开关编译静态库或目标文件时。

2) 当使用使用版本高于用于编译和链接应用程序的工具集的工具集构建的库时。例如,使用编译器版本 19.12 编译和链接的程序可以使用使用 19.0 到 19.12 编译的库。此外,二进制兼容性仅存在于 Visual Studio 2015 和 Visual Studio 2017 之间;不支持将 19.x 程序与 Visual Studio 2013 或更早版本生成的库链接。

例外2让我感到困惑。为什么在这种情况下不能保证二进制兼容性?

让我们更具体一点。提供了一个文件夹,其中包含自定义 exe、自定义 dll 和部分 vc_toolset dll(v140 或 v141)。自定义 exe 和自定义 dll 都动态链接到 vc_toolset dll 的一部分,其中包括 CRT dll、msvcp140.dll、vcruntime140.dll。此外,未启用 /GL 选项。

我在下面列出了几种组合。我想知道每个人的二进制兼容性。

1)vs2015构建的exe + vs2015构建的dll + vs2015的v140工具集dll

我认为在这种情况下可以保证二进制兼容性。

2)vs2015构建的exe + vs2015构建的dll + vs2017的v141工具集dll

此外,基于案例 1,工具集 dll 被替换为 vs2017 附带的较新版本。

另外,我认为在这种情况下可以保证二进制兼容性。

3)vs2015构建的exe + vs2017重构的dll + vs2015的v140工具集dll

基于案例 1,使用 vs2017 重建了自定义 dll。那么有两种选择:

a) 只需替换 dll,不会使用新 dll 的导入库重建 exe

b) 使用新 dll 的导入库替换 dll 并重建 exe。

根据上面链接的异常2,在a)和b)情况下不能保证二进制兼容性。但为什么 ?自定义dll的所有接口和依赖都没有改变,也不依赖v141的新特性。

4)vs2015构建的exe + vs2017重构的dll + vs2017的v141工具集dll

此外,基于案例 3,工具集 dll 被替换为 vs2017 附带的较新版本。

5) vs2017重建的exe + vs2015构建的dll + vs2015的v140工具集dll

基于案例1,自定义exe使用vs2017重建,并与之前由vs2015构建的自定义dll的导入库链接

根据上面的链接,我认为在这种情况下可以保证二进制兼容性。

6) vs2017重建的exe + vs2015构建的dll + vs2017的v141工具集dll

此外,基于案例 5,工具集 dll 被替换为 vs2017 附带的较新版本。如果可以保证案例5和案例2,我认为在这种情况下也可以保证。

我的理解正确吗?

标签: c++visual-studio-2015visual-studio-2017binary-compatibility

解决方案


由于您明确调用

... CRT DLL ...

我将回答那部分:

VS2017 CRT 和 VS2015 CRT 之间的向后兼容性是 100% 保证的!(当然是模 MS 错误。)

我怎么能这么说?MSVC CRT 的默认部署方法是将所有 CRT 文件部署到System32,因此大多数应用程序将使用一 (1) 个全局 CRT DLL 集。(至少 AFAIKT,许多应用程序使用 DLL 形式的 MS CRT,但不要将所有 CRT DLL 捆绑在其应用程序目录中。)

对于 VS 2017 和 2015,所有 CRT DLL 都具有 相同的文件名,即msvcp140.dllvcruntime140.dll没有141文件!(所以子弹点6不存在。)

因此,给定的 Windows 系统最多可以拥有一组全局 CRT140 文件,并且由于没有应用程序控制这一点,因此 CRT140 的较新版本必须向后兼容针对旧版本构建的应用程序。


鉴于此,我根本不会根据您的问题做案例35(关于 CRT):始终部署您的组件所依赖的最新MS CRT。

甚至找到了一个博客条目。这个(2017/03/07):

... VCRedist 仅向后兼容,因此您需要使用您的应用重新分发 VS 2017 中可用的最新 VCRedist 140。...


关于第 3 点和第 4 点的情况2015.exe <-> 2017.dll,我提出了一个新问题:VS2017 和 VS2015 应用程序与 dll 之间的官方二进制不兼容是否准确?因为这真的很奇怪,恕我直言。


推荐阅读