VS2017 和 VS2015 之间的二进制兼容性

Binary compatibility between VS2017 and VS2015

这样 post: 明明说VS 2017是二进制兼容VS 2015的,甚至官方的说法也很像

我的问题是,在过去,每次我尝试 link 时,我都清楚地记得 运行 进入 linker 错误(我不记得具体的一组错误)在 静态库 中,它是用不同版本的 MSVC 编译成一个用更新版本的 MSVC 构建的 EXE。

然而,二进制(内部)兼容性听起来像是会在 运行时 而不是 link 时当面炸毁的东西。

有人可以告诉我以前版本的 MSVC 是否确实在版本不匹配时产生了 linker 错误?这是如何实现的?

编辑

这对打开 WPO/LTCG 构建的静态库有何影响?我相信这些会产生中间目标文件(与 COFF 相对),并且 Microsoft 不保证这些中间文件的格式在不同版本的编译器中保持不变。

Microsoft 声称它们是兼容的,这得到了这次从 1400 提高到 1410 的编译器版本号的支持:

https://blogs.msdn.microsoft.com/vcblog/2017/03/07/binary-compatibility-and-pain-free-upgrade-why-moving-to-visual-studio-2017-is-almost-too-easy/

正如我对 linked 问题的回答,VS 2015 中的 v140 工具集和 VS 2017 中的 v141 工具集是二进制兼容的。 v141 是作为同一个 "family" 的成员构建的,因为对 v140 的所有更新(例如,VS 2015 更新 1、2、3)都在同一个系列中。这是一个有意的设计决策,可帮助开发人员迁移到新版本的 VS,而不必担心必须更改其源代码。

VS 2017 可以支持多个工具集。下一个工具集将不与 v140/v141 二进制兼容。但是您仍然可以在移动代码以与下一个工具集中的新 C++ 功能兼容时安装 v141。

请注意,我们从未支持跨主要版本的二进制兼容性。你不能 link 一个用 v140 构建的二进制文件和一个用 v130 构建的二进制文件,不管 WPO/LTCG/etc。是的,它经常有效——我们经常尝试尽量减少库中的破坏性更改,因此 link 跨主要版本编辑一些代码不会遇到任何错误。但最终你会 运行 发生变化,你会看到一个错误。

至于您看到的是link错误还是运行时间错误,这取决于您调用的不兼容库API。如果 API 的导出形状发生变化——函数名称、参数数量——那么 link 用户将无法找到它。如果形状相同但行为发生了变化,您可能会以 运行 时间失败告终。

--Andrew Pardoe,MSVC 工具