2

这篇 SO 帖子: Visual-C++-2017 二进制文件是否与 VC++-2015 兼容?明确表示 VS 2017 与 VS 2015 二进制兼容。它甚至看起来像官方的立场。

我的问题是,在过去,我清楚地记得每次尝试将使用不同版本的 MSVC 编译的静态库链接到 EXE 时遇到链接器错误(我不记得具体的错误集)使用更新版本的 MSVC 构建。

然而,二进制(不)兼容性听起来像是在运行时而不是链接时会在你面前爆炸的东西。

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

编辑

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

4

2 回答 2

5

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

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

请注意,我们从未支持跨主要版本的二进制兼容性。无论 WPO/LT​​CG/等如何,您都无法链接使用 v140 构建的二进制文件和使用 v130 构建的二进制文件。是的,它经常起作用——我们试图尽量减少库中的重大更改,因此跨主要版本链接一些代码不会遇到任何错误。但最终你会遇到一些改变的东西,你会看到一个错误。

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

--Andrew Pardoe,MSVC 工具

于 2017-06-01T17:45:46.150 回答
2

微软声称它们是兼容的,这得到了编译器版本号的支持,这次刚刚从 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-简单的/

于 2017-06-01T17:30:35.683 回答