https://learn.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2017 https://learn.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+dll构建的exerebuilt通过 vs2017 + vs2015 的 v140 工具集 dll
基于案例1,使用vs2017重建自定义dll。那么有两个选择:
a) 只需替换 dll,并且不会使用新 dll 的导入库重建 exe
b) 替换 dll 并使用新 dll 的导入库重建 exe。
根据上面链接的例外2,在a)和b)情况下不能保证二进制兼容性。但为什么 ?自定义dll的所有接口和依赖项均未更改,并且不依赖于v141的新功能。
4)vs2015+dll构建的exerebuilt通过 vs2017 + vs2017 的 v141 工具集 dll
此外,基于案例 3,工具集 dll 已替换为 vs2017 附带的较新版本。
5)exe rebuilt由 vs2017 + vs2015 构建的 dll + vs2015 的 v140 工具集 dll
基于案例1,使用vs2017重新构建自定义exe,并与之前由vs2015构建的自定义dll的导入库链接
根据上面的链接,我认为这种情况下可以保证二进制兼容性。
6)exe rebuilt由 vs2017 + vs2015 构建的 dll + vs2017 的 v141 工具集 dll
此外,基于案例 5,工具集 dll 已替换为 vs2017 附带的较新版本。
如果情况5和情况2可以保证的话,我想在这种情况下也是可以保证的。
我的理解正确吗?