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

时间:2017-05-31 15:27:16

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

这个SO帖子: Is Visual-C++-2017 binary compatible with VC++-2015?明确表示VS 2017与VS 2015二进制兼容。它甚至看起来像官方立场。

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

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

有人可以告诉我,以前版本的MSVC是否确实在版本不匹配时生成链接器错误?这是怎么实现的?

修改

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

2 个答案:

答案 0 :(得分:5)

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

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

请注意,我们从不支持跨主要版本的二进制兼容性。无论WPO / LTCG /等等,您都无法链接使用v140构建的二进制文件和使用v130构建的二进制文件。是的,它经常有效 - 我们尝试最小化我们库中的重大变化,因此通常情况下,将主要版本之间的某些代码链接起来不会出现任何错误。但最终你会遇到一些变化,你会看到一个错误。

关于您是否看到链接错误或运行时错误,这取决于您调用的不兼容的库API。如果导出的API形状发生了变化 - 函数名称,参数数量 - 那么链接器将无法找到它。如果形状相同但行为已更改,则最终可能会出现运行时故障。

- Andrew Pardoe,MSVC工具

答案 1 :(得分:2)

微软声称它们是兼容的,而这一点得到了编译器的verison编号的支持,这次编号只是从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/